2014-04-16 5 views
15

हाइबरनेट एपीआई में, एक संपत्ति hibernate.connection.autocommit है जिसे सत्य पर सेट किया जा सकता है।हाइबरनेट में "hibernate.connection.autocommit = true" क्यों अनुशंसित नहीं है?

लेकिन एपीआई में, वे उल्लेख किया है कि यह इतना है कि यह निर्धारित करने के लिए अनुशंसित नहीं है:

JDBC जमा कनेक्शन के लिए सक्षम बनाता है autocommit (यह नहीं है अनुशंसित)।

इसकी अनुशंसा क्यों नहीं की जाती है? इस संपत्ति को सही करने के दुष्प्रभाव क्या हैं?

उत्तर

6

मेरी समझ यह है कि यदि हाइबरनेट ऑटोोकॉमिट्स है, तो एक फ्लश जो भागने में विफल रहता है उसे वापस नहीं किया जाएगा। आपके पास अपूर्ण/टूटा ऑब्जेक्ट ग्राफ़ होगा।

आप कुछ के लिए पर autocommit के साथ एक संबंध चाहते हैं, तो आप हमेशा खोलने कर सकते हैं एक नव निर्मित Session अंतर्निहित JDBC कनेक्शन, setAutocommit(true) उस पर मिलता है, JDBC एपीआई, setAutocommit(false) के माध्यम से अपना काम करो, और सत्र बंद हुआ। मैं Session पर ऐसा करने की अनुशंसा करता हूं जो पहले से ही कुछ भी कर चुका है।

+0

हाइबरनेट एचडी के तहत जेडीबीसी का उपयोग करता है। ऑटोकॉमिट जेडीबीसीसीनेक्शन की अवधारणा है, जिसका अर्थ है "प्रति विवरण लेनदेन"। लेनदेन का दायरा = 1 वर्ग कथन [autocommit = true] hibernate.connection.autoCommit = सत्य प्रत्येक कथन को समाप्त होने के बाद प्रतिबद्ध करता है, इसलिए हम काम की एकल इकाई के हिस्से के रूप में 2 या अधिक कथन/रोलबैक नहीं कर सकते हैं। हम चाहते हैं- या तो सभी कथन चलाएं या कोई भी रन न चलाएं - इसके लिए हमें लेनदेन की शुरुआत और अंत को चिह्नित करने की आवश्यकता है और हमें ऑटोकॉमिट को अक्षम करने की आवश्यकता है। –

+0

hibernate.connection.autocommit = false 2 परिदृश्य स्पष्ट लेन-देन सीमा:। sessionFactory.openSession() session.beginTransaction() session.getTransaction() के लिए प्रतिबद्ध() // Flushes सत्र, प्रतिबद्धता TXN सत्र। करीब() अंतर्निहित लेन-देन सीमा sessionFactory.openSession() // कोई लेन-देन के उपयोग, // लेकिन इसके अंतर्निहित TXN देखें क्योंकि - Autocommit यहाँ गलत है session.flush() session.close() - जब हम सत्र बंद करते हैं, विशिष्ट एयनियन स्पष्ट नहीं है तो विक्रेता विशिष्ट व्यवहार ओरेकल में - सभी एसक्यूएल स्टेटमेंट पोस्टग्रेस्क्ल में प्रतिबद्ध होते हैं - सभी एसक्यूएल स्टेटमेंट रोलबैक –

10

डिफ़ॉल्ट रूप से ऑटोोकॉमिट मान गलत है, इसलिए लेनदेन को स्पष्ट रूप से कम करने की आवश्यकता है। यह कारण हो सकता है कि परिवर्तन डेटाबेस में प्रतिबिंबित नहीं हो रहे हैं, अन्यथा प्रतिबद्ध होने से पहले परिवर्तनों को बल देने के लिए फ्लश करने का प्रयास कर सकते हैं।

जब आप सत्र बंद करते हैं, तो यह डेटाबेस में अंतर्निहित हो जाएगा [कार्यान्वयन पर निर्भर करता है]।

जब आपके पास कैस्केडिंग लेनदेन & परमाणुता के लिए रोलबैक की आवश्यकता है, तो आपको उस मामले में लेनदेन & पर नियंत्रण रखना होगा, ऑटोोकॉमिट गलत होना चाहिए।

या तो ऑटोोकॉमिट को सत्य के रूप में सेट करें या लेनदेन को स्पष्ट रूप से संभाल लें।

Here इस पर एक अच्छी व्याख्या है।

Hibernate forum इससे संबंधित।

Stackoverflow question उस पर।

4

सभी डेटाबेस स्टेटमेंट्स को एक भौतिक लेनदेन, even when we don’t explicitly declare transaction boundaries (BEGIN/COMMIT/ROLLBACK) के संदर्भ में निष्पादित किया जाता है।

यदि आप लेनदेन की सीमाएं घोषित नहीं करते हैं, तो प्रत्येक कथन को एक अलग लेनदेन में निष्पादित करना होगा। इससे प्रति कथन एक कनेक्शन खोलने और बंद करने का भी कारण हो सकता है।

@ ट्रांसेक्शनल के रूप में सेवा घोषित करने से आपको संपूर्ण लेनदेन अवधि के लिए एक कनेक्शन मिल जाएगा, और सभी कथन उस एकल अलगाव कनेक्शन का उपयोग करेंगे। यह पहली जगह स्पष्ट लेनदेन का उपयोग न करने से बेहतर तरीका है। बड़े अनुप्रयोगों पर आपके पास कई समवर्ती अनुरोध हो सकते हैं और reducing database connection acquiring request rate निश्चित रूप से आपके समग्र एप्लिकेशन प्रदर्शन में सुधार कर रहा है।

तो अंगूठे का नियम है:

  1. आप केवल पठन-लेनदेन है कि केवल एक ही क्वेरी निष्पादित है, तो आप सक्षम कर सकते हैं उन लोगों के लिए स्वतः-लिखें।

  2. यदि आपके पास एक से अधिक कथन में लेनदेन हैं, तो आपको ऑटो-प्रतिबद्धता को अक्षम करने की आवश्यकता है, क्योंकि आप सभी परिचालनों को एक इकाई के काम में निष्पादित करना चाहते हैं और आप अतिरिक्त दबाव नहीं डालना चाहते हैं आपका कनेक्शन पूल

2

सत्र-प्रति-ऑपरेशन एंटीपार्टर्न का उपयोग न करें: एकल थ्रेड में प्रत्येक सरल डेटाबेस कॉल के लिए सत्र खोलें और बंद न करें। डेटाबेस लेनदेन के लिए भी यही सच है। किसी एप्लिकेशन में डेटाबेस कॉल एक नियोजित अनुक्रम का उपयोग करके किए जाते हैं; वे काम की परमाणु इकाइयों में समूहित हैं। इसका यह भी अर्थ है कि प्रत्येक एकल SQL कथन के बाद स्वत: प्रतिबद्धता अनुप्रयोग में बेकार है क्योंकि यह मोड विज्ञापन-प्रसार SQL कंसोल कार्य के लिए है। हाइबरनेट अक्षम करता है, या अनुप्रयोग सर्वर को अक्षम करने की अपेक्षा करता है, तुरंत ऑटो-प्रतिबद्ध मोड। डेटाबेस लेनदेन कभी वैकल्पिक नहीं होते हैं। किसी लेनदेन के अंदर डेटाबेस के साथ सभी संचार होना पड़ता है। डेटा पढ़ने के लिए स्वत: प्रतिबद्ध व्यवहार से बचा जाना चाहिए, क्योंकि कई छोटे लेनदेन काम की एक स्पष्ट रूप से परिभाषित इकाई से बेहतर प्रदर्शन करने की संभावना नहीं है। उत्तरार्द्ध भी अधिक रखरखाव और एक्स्टेंसिबल है।

find more information on this topic

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