दिलचस्प पोस्ट
मैं पायथन में एक पेड़ को कैसे लागू कर सकता हूं? क्या कोई जावा में पायथन में डेटा संरचनाओं में बनाया गया है? (कैसे) मैं एक enum में आइटम गिन सकते हैं? क्या आप अपने वाणिज्यिक जावा कोड को अस्पष्ट करते हैं? जावा शुरू कर दिया गया था, लेकिन निकास कोड = -80530636 9 लौट आया एक्सेल VBA का उपयोग कर कमांड प्रॉम्प्ट में एक कमांड निष्पादित करें क्या MySQL कनेक्शन को बंद करना महत्वपूर्ण है? मैं XSLT के साथ स्ट्रिंग को ऊपरी या निचले-वर्ग में कैसे रूपांतरित कर सकता / सकती हूं? सी फ़ंक्शन के लिए PInvoke जो चार * जब बंदर एक विधि को पैचिंग करते हैं, तो क्या आप नए कार्यान्वयन से ओवरराइड विधि को कॉल कर सकते हैं? SQLServer 2005 फ़ंक्शन में डायनामिक एसक्यूएल निष्पादित करना वेब पेज के नीचे रहने के लिए आप पाद लेख कैसे प्राप्त कर सकते हैं? जीआईटी का प्रयोग मैं स्थानीय और दूरदराज के बीच के बदलावों को कैसे प्राप्त करूं? लुआ टेबल में प्रविष्टियों की संख्या कैसे प्राप्त करें? पायथन में कैसे मैं कक्षा विधियों के भीतर "स्थिर" वर्ग चर का उपयोग कर सकता हूं क्या हस्ताक्षरित इंटिजर्स पर बिटवर्ड ऑपरेशन के परिणाम परिभाषित किए गए हैं?

बैचे आकार का भ्रम हाइबरनेट करें

यह कार्यक्रम हजारों से लगातार आवेषण करता है जो दूसरे के बाद एक है। मैंने कभी भी हाइबरनेट का उपयोग नहीं किया है मैं बेहद धीमी गति से प्रदर्शन कर रहा हूं (अगर मैं मैन्युअल रूप से एसक्यूएल को कनेक्ट और निष्पादित करता हूं तो मैं 10-12x तेज हूं) मेरे बैच_आइजेट को कई हाइबरनेट ट्यूटोरियल के अनुसार 50 पर सेट किया गया है।

यहां एक सम्मिलन से एक लॉग है – शायद आप मुझे ये समझने में मदद कर सकते हैं कि वास्तव में क्या हो रहा है:

START INSERT 11:02:56.121 [main] DEBUG org.hibernate.impl.SessionImpl - opened session at timestamp: 13106053761 11:02:56.121 [main] DEBUG ohtransaction.JDBCTransaction - begin 11:02:56.121 [main] DEBUG org.hibernate.jdbc.ConnectionManager - opening JDBC connection 11:02:56.121 [main] TRACE ohcDriverManagerConnectionProvider - total checked-out connections: 0 11:02:56.121 [main] TRACE ohcDriverManagerConnectionProvider - using pooled JDBC connection, pool size: 0 11:02:56.121 [main] DEBUG ohtransaction.JDBCTransaction - current autocommit status: false 11:02:56.121 [main] TRACE org.hibernate.jdbc.JDBCContext - after transaction begin 11:02:56.121 [main] TRACE org.hibernate.impl.SessionImpl - setting flush mode to: MANUAL 11:02:56.121 [main] TRACE ohedef.DefaultLoadEventListener - loading entity: [com.xyzcompany.foo.edoi.ejb.msw000.MSW000Rec#component[keyW000]{keyW000=F000 ADSUFC}] 11:02:56.121 [main] TRACE ohedef.DefaultLoadEventListener - creating new proxy for entity 11:02:56.122 [main] TRACE ohedDefaultSaveOrUpdateEventListener - saving transient instance 11:02:56.122 [main] DEBUG ohedef.AbstractSaveEventListener - generated identifier: component[keyW000]{keyW000=F000 ADSUFC}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator 11:02:56.122 [main] TRACE ohedef.AbstractSaveEventListener - saving [com.xyzcompany.foo.edoi.ejb.msw000.MSW000Rec#component[keyW000]{keyW000=F000 ADSUFC}] 11:02:56.123 [main] TRACE ohedAbstractFlushingEventListener - flushing session 11:02:56.123 [main] DEBUG ohedAbstractFlushingEventListener - processing flush-time cascades 11:02:56.123 [main] DEBUG ohedAbstractFlushingEventListener - dirty checking collections 11:02:56.123 [main] TRACE ohedAbstractFlushingEventListener - Flushing entities and processing referenced collections 11:02:56.125 [main] TRACE ohedAbstractFlushingEventListener - Processing unreferenced collections 11:02:56.125 [main] TRACE ohedAbstractFlushingEventListener - Scheduling collection removes/(re)creates/updates 11:02:56.126 [main] DEBUG ohedAbstractFlushingEventListener - Flushed: 1 insertions, 0 updates, 0 deletions to 62 objects 11:02:56.126 [main] DEBUG ohedAbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 11:02:56.132 [main] TRACE ohedAbstractFlushingEventListener - executing flush 11:02:56.132 [main] TRACE org.hibernate.jdbc.ConnectionManager - registering flush begin 11:02:56.132 [main] TRACE ohpentity.AbstractEntityPersister - Inserting entity: [com.xyzcompany.foo.edoi.ejb.msw000.MSW000Rec#component[keyW000]{keyW000=F000 ADSUFC}] 11:02:56.132 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 11:02:56.132 [main] DEBUG org.hibernate.SQL - insert into MSW000 (W000_DATA_REC, W000_FILE_FLAGS, KEY_W000) values (?, ?, ?) 11:02:56.132 [main] TRACE org.hibernate.jdbc.AbstractBatcher - preparing statement 11:02:56.132 [main] TRACE ohpentity.AbstractEntityPersister - Dehydrating entity: [com.xyzcompany.foo.edoi.ejb.msw000.MSW000Rec#component[keyW000]{keyW000=F000 ADSUFC}] 11:02:56.132 [main] TRACE org.hibernate.type.StringType - binding ' ADSUFCA ' to parameter: 1 11:02:56.132 [main] TRACE org.hibernate.type.StringType - binding ' ' to parameter: 2 11:02:56.132 [main] TRACE org.hibernate.type.StringType - binding 'F000 ADSUFC' to parameter: 3 11:02:56.132 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - Executing batch size: 1 11:02:56.133 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 11:02:56.133 [main] TRACE org.hibernate.jdbc.AbstractBatcher - closing statement 11:02:56.133 [main] TRACE org.hibernate.jdbc.ConnectionManager - registering flush end 11:02:56.133 [main] TRACE ohedAbstractFlushingEventListener - post flush 11:02:56.133 [main] DEBUG ohtransaction.JDBCTransaction - commit 11:02:56.133 [main] TRACE org.hibernate.impl.SessionImpl - automatically flushing session 11:02:56.133 [main] TRACE org.hibernate.jdbc.JDBCContext - before transaction completion 11:02:56.133 [main] TRACE org.hibernate.impl.SessionImpl - before transaction completion 11:02:56.133 [main] DEBUG ohtransaction.JDBCTransaction - committed JDBC Connection 11:02:56.133 [main] TRACE org.hibernate.jdbc.JDBCContext - after transaction completion 11:02:56.133 [main] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 11:02:56.133 [main] TRACE org.hibernate.impl.SessionImpl - after transaction completion 11:02:56.133 [main] TRACE org.hibernate.impl.SessionImpl - closing session 11:02:56.133 [main] TRACE org.hibernate.jdbc.ConnectionManager - performing cleanup 11:02:56.133 [main] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 11:02:56.133 [main] TRACE ohcDriverManagerConnectionProvider - returning connection to pool, pool size: 1 11:02:56.133 [main] TRACE org.hibernate.jdbc.JDBCContext - after transaction completion 11:02:56.133 [main] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 11:02:56.134 [main] TRACE org.hibernate.impl.SessionImpl - after transaction completion FINISH INSERT 

Solutions Collecting From Web of "बैचे आकार का भ्रम हाइबरनेट करें"

जब आप session.save() कॉल करते हैं, तो हाइबरनेट INSERT SQL उत्पन्न करेगा। इस INSERT एसक्यूएल को फ्लशिंग के दौरान डीबी को जारी किए जाने के लिए जोड़ा जाएगा (अर्थात session.flush() )।

फ्लशिंग के दौरान, यदि hibernate.jdbc.batch_size । जेडीबीसी बैच_आइज को कुछ गैर-शून्य मान पर सेट किया जाता है, तो hibernate.jdbc.batch_size जेबीडीसी 2 एपीआई में शुरू की गई बैचिंग फीचर का इस्तेमाल करेगा जो डीबी को बैच डालें SQL जारी करेगा।

उदाहरण के लिए, यदि आप save() 100 रिकॉर्ड save() और आपका hibernate.jdbc.batch_size । Jdbc.batch_size 50 पर सेट होता है। फ्लशिंग के दौरान, निम्नलिखित SQL 100 बार जारी करने की बजाय:

 insert into TableA (id , fields) values (1, 'val1'); insert into TableA (id , fields) values (2, 'val2'); insert into TableA (id , fields) values (3, 'val3'); ......................... insert into TableA (id , fields) values (100, 'val100'); 

हिचिकित्सक उन्हें 50 के बैचों में समूहबद्ध करेगा, और केवल डीबी के लिए 2 एसक्यूएल जारी करें, जैसे:

 insert into TableA (id , fields) values (1, 'val1') , (2, 'val2') ,(3, 'val3') ,(4, 'val4') ,......,(50, 'val50') insert into TableA (id , fields) values (51, 'val51') , (52, 'val52') ,(53, 'val53') ,(54, 'val54'),...... ,(100, 'val100') 

कृपया ध्यान दें कि हाइबरनेट जेडीबीसी स्तर पर बैचिंग को अक्षम कर देगा यदि सम्मिलन तालिका की प्राथमिक कुंजी है GenerationType.Identity

आपके लॉग से: आप save() केवल एक रिकॉर्ड को save() और फिर flush() , इसलिए प्रत्येक फ्लश के लिए संसाधित किए जाने वाले INSERT SQL को केवल एक ही जोड़ा जाता है। यही कारण है कि हाइबरनेट बैच को डालने में आपकी मदद नहीं कर सकता क्योंकि प्रोसेस करने के लिए केवल एक INSERT SQL है। आपको प्रत्येक save() लिए flush() कॉल करने के बजाय flush() को कॉल करने से पहले रिकॉर्ड्स की कुछ निश्चित मात्रा तक save() चाहिए save()

बैच डालने का सर्वोत्तम अभ्यास ऐसा कुछ है:

 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<888888; i++ ) { TableA record = new TableA(); record.setXXXX(); session.save(record) if ( i % 50 == 0 ) { //50, same as the JDBC batch size //flush a batch of inserts and release memory: session.flush(); session.clear(); } } tx.commit(); session.close(); 

बैच द्वारा रिकॉर्ड बैच को बचाने और फ्लश करने के लिए। प्रत्येक बैच के अंत में आपको धीमी गति से स्मृति को समाप्त करने के लिए कुछ स्मृति को रिलीज करने के संदर्भ को स्पष्ट करना चाहिए क्योंकि प्रत्येक निरंतर वस्तु को प्रथम स्तर कैश (आपकी जेवीएम की मेमोरी) में रखा गया है। आप अनावश्यक ओवरहेड को कम करने के लिए द्वितीय-स्तरीय कैश को अक्षम भी कर सकते हैं।


संदर्भ:

  • आधिकारिक हाइबरनेट दस्तावेज़ीकरण: अध्याय 14. बैच प्रसंस्करण
  • बैच प्रसंस्करण सीतनिद्रा में होना – क्यों आप इसे उपयोग नहीं किया जा सकता है (यहां तक ​​कि अगर आपको लगता है कि आप हैं)

यदि आपको बड़ी बैच की नौकरियों के लिए सीतनिद्रा में इस्तेमाल करना चाहिए, तो स्टेटलेससेशन जाने का तरीका है। यह चीजों को सबसे बुनियादी रूपांतरण-ऑब्जेक्ट्स टू टू-एसक्यूएल-स्टेटमेंट मैपिंग के लिए नीचे खींचती है और ओआरएम सुविधाओं के सभी ओवरहेड्स को समाप्त करती है, जो कि आप डीबी थोक में पंक्तियों को कुचलने के समय उपयोग नहीं कर रहे हैं।

लॉग से आपके वास्तविक कोड पर सुझाव बनाना बहुत आसान होगा 🙂

 11:02:56.133 [main] DEBUG ohtransaction.JDBCTransaction - commit 

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