2010-02-20 19 views
5

मुझे MySQL पर थोक प्रविष्टि करने के लिए हाइबरनेट प्राप्त करने में समस्या हो रही है।हाइबरनेट/MySQL थोक सम्मिलित समस्या

मैं हाइबरनेट 3.3 और MySQL 5.1

एक उच्च स्तर पर, यह क्या हो रहा है है का उपयोग कर रहा:

@Transactional 
public Set<Long> doUpdate(Project project, IRepository externalSource) { 
    List<IEntity> entities = externalSource.loadEntites(); 
    buildEntities(entities, project); 
    persistEntities(project); 
} 
public void persistEntities(Project project) { 
    projectDAO.update(project); 
} 

यह (1 हर पंक्ति के लिए) n लॉग प्रविष्टियों में परिणाम इस प्रकार है:

हाइबरनेट: (?????,,,,,) ProjectEntity (नाम, PARENT_ID, पथ, PROJECT_ID, राज्य, प्रकार) को महत्व देता में डालने

+०१२३५१६४१०६१

मैं यह देखना चाहता हूं कि यह बैच हो जाए, इसलिए अद्यतन अधिक प्रदर्शनशील है। यह संभव है कि इस दिनचर्या के परिणामस्वरूप हजारों पंक्तियां उत्पन्न हो सकें, और प्रति पंक्ति एक डीबी यात्रा एक हत्यारा है।

यह बैच क्यों नहीं हो रहा है? (यह मेरी समझ है कि बैच आवेषण डिफ़ॉल्ट होने चाहिए जहां हाइबरनेट द्वारा उचित)।

उत्तर

5

Chapter 13. Batch processing में दस्तावेज के रूप में:

आप प्रसंस्करण आप JDBC बैचिंग की उपयोग को सक्षम करना होगा बैच उपक्रम कर रहे हैं। बिल्कुल आवश्यक है यदि आप इष्टतम प्रदर्शन प्राप्त करना चाहते हैं। (10-50 उदाहरण के लिए) एक उचित संख्या को JDBC बैच का आकार सेट करें:

hibernate.jdbc.batch_size 20 

हाइबरनेट JDBC स्तर पर डालने बैचिंग को निष्क्रिय पारदर्शी रूप से यदि आप एक पहचान पहचानकर्ता जनरेटर का उपयोग ।

सत्र नियमित रूप से flush और फिर clear के लिए मत भूलना या आप OutOfMemoryException मिल जाएगा के रूप में 13.1. Batch inserts में प्रलेखित।

लेकिन आईएमओ, हजारों पंक्तियों के लिए, आपको the StatelessSession interface का उपयोग करने पर विचार करना चाहिए।

+0

क्या यह एसक्यूएल-स्टेटमेंट्स की बैचिंग सक्षम करेगा? (क्या सत्र बैचिंग के लिए ऑर्थोगोनल की बजाय राज्य ध्वनियां रखता है, लेकिन शायद मैं कक्षा के नाम से बहुत अधिक अनुमान लगाता हूं) – meriton

+0

@meriton मैंने अधिक जानकारी जोड़ने के लिए अपना उत्तर अपडेट कर दिया है। –

+0

+1: अब मुझे मिल गया, धन्यवाद! – meriton

0

पास्कल ने इसे हाइबरनेट संदर्भ में काफी हद तक खींचा है। एक विकल्प के रूप में, आप jbdc टेम्पलेट के बैचस्क्लुपडेट का उपयोग कर सकते हैं। हालांकि मुझे आपको चेतावनी देना है कि कैश किए गए उदाहरण हाइबरनेट ऊपर दिए गए परिवर्तनों को प्रतिबिंबित नहीं कर सकते हैं। हमारी परियोजना में, हमें एक अलग कार्यक्रम (एक और समस्या बनाई गई, लेकिन हमारे नियंत्रण में) द्वारा इसे दूर करने के लिए सावधानी पूर्वक उपाय करना पड़ा।

7

पास्कल का जवाब सही है। हालांकि, क्योंकि आप MySQL का उपयोग कर रहे हैं, मैं भी अत्यधिक अनुशंसा करता हूं कि आप अपने जेडीबीसी यूआरएल में rewriteBatchedStatements=true पैरामीटर का उपयोग करने का प्रयास करें।

यह पैरामीटर जेडीबीसी ड्राइवर को एक "बहु-मूल्यवान" INSERT का उपयोग करने के लिए आपके INSERT बैचों को गतिशील रूप से फिर से लिखने का कारण बनता है।:

INSERT INTO mytable (mycol) VALUES (0); 
INSERT INTO mytable (mycol) VALUES (1); 
INSERT INTO mytable (mycol) VALUES (2); 

को फिर से लिखा जाएगा:

INSERT INTO mytable (mycol) VALUES (0), VALUES (1), VALUES (2); 

कुछ मामलों में यह एक महत्वपूर्ण अंतर कर सकते हैं। कुछ उदाहरण मापों के लिए http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for देखें।

संबंधित मुद्दे