2010-09-25 17 views
7

के लिए setAutoCommit चलो कहते हैं कि मैं एक आम तरीका है जो एक DB कनेक्शन बन करते हैं। हालांकि, क्या यह एक बुरा अभ्यास है यदि कॉलर द्वारा निष्पादित ऑपरेशन केवल डेटा पढ़ रहा है? क्या कोई अतिरिक्त उपर है?JDBC केवल पढ़ने के लिए आपरेशन

मेरी व्यक्तिगत राय यह है कि एक स्थान पर तर्क को केंद्रीकृत करना बेहतर है, इस तरह कॉलर्स को कभी भी ऑटो प्रतिबद्धता सेट नहीं करना पड़ता है और इससे कोड रिडंडेंसी से बचा जाता है। मैं बस यह सुनिश्चित करना चाहता था कि इसे केवल पढ़ने के लिए किसी भी अनावश्यक ओवरहेड नहीं लगे।

उत्तर

5

मैंने सेटऑटो कॉमिट (झूठी) कॉल यहां रखा ताकि इस विधि के कॉलर्स को इसे सेट करने के बारे में चिंता न करें।

यह ठीक आईएमओ है और मैं व्यक्तिगत रूप से मानता हूं कि किसी को कभी भी एप्लिकेशन के अंदर ऑटो-प्रतिबद्ध मोड सक्षम नहीं करना चाहिए। तो मेरी सिफारिश ऑटो-प्रतिबद्धता को बंद करना होगा।

हालांकि, क्या यह एक बुरा अभ्यास है यदि कॉलर द्वारा निष्पादित ऑपरेशन केवल डेटा पढ़ रहा है? क्या कोई अतिरिक्त उपर है?

एक सख्त प्रदर्शन बिंदु से, यह प्रत्येक SQL कथन के लिए डेटाबेस लेनदेन को शुरू और समाप्त कर रहा है जिसमें ओवरहेड है और आपके आवेदन के प्रदर्शन को कम कर सकता है।

वैसे, SELECT स्टेटमेंट्स जावाडोक के अनुसार setAutoCommit(boolean) से प्रभावित हैं:

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

प्रतिबद्धता तब होती है जब कथन पूर्ण हो जाता है। समय था जब बयान कम्प्लिट्स एसक्यूएल वक्तव्य के प्रकार पर निर्भर:

  • ऐसे सम्मिलित करें, अद्यतन या हटाएं, और DDL बयान, के रूप में DML बयान, के लिए बयान पूरा जैसे ही के रूप में यह है निष्पादन समाप्त हो गया।
  • बयानों का चयन के लिए, बयान पूरा जब जुड़े परिणाम सेट बंद कर दिया जाता है।
  • CallableStatement वस्तुओं के लिए या बयान कि कई परिणाम वापस के लिए, बयान पूरा जब सेट जुड़े परिणाम के सभी बंद कर दिया गया है, और सभी अद्यतन मायने रखता है और उत्पादन मानकों लिया गया किया गया है है।
+0

मैं लेनदेन शुरू करने और समाप्त होने के प्रदर्शन के मुद्दे से असहमत हूं। यह मेरा अनुभव कभी नहीं रहा है, बल्कि कई लंबे लेनदेन कई छोटे लोगों की तुलना में अधिक बाधाओं का कारण बनता है। क्या आपके पास इसके विपरीत कोई सबूत है? – beldaz

5

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

+0

हैलो बलससी। क्या आप पहली वाक्य पर विस्तार कर सकते हैं? ऐसा नहीं है कि मैंने javadoc कैसे पढ़ा। –

+0

@ पास्कल: यह वास्तव में थोड़ा खराब वाक्यांश था। – BalusC

+0

मैं देखता हूं। बेहतर अब आईएमओ। –

1

मेरे पास एप्लिकेशन में कहीं भी ऑटोकॉमिट सही नहीं होगा। सब किसी में प्रदर्शन भूमि के ऊपर अगर एक autocommit=true कनेक्शन की प्रभाव पक्ष की तुलना में कुछ भी नहीं है।

आप कहते हैं कि आप DML के लिए इस कनेक्शन का उपयोग कभी नहीं होगा। लेकिन उस इरादा, मानकों आदि कोडिंग द्वारा लेकिन व्यवहार में शायद बनाए रखा है, यह DML बयानों के लिए इस कनेक्शन का उपयोग करने के लिए संभव है। मेरे लिए ऑटो-प्रतिबद्धता सेट करने के लिए यह पर्याप्त कारण नहीं है।

Select बयान निश्चित रूप से कुछ स्मृति/सीपीयू/नेटवर्क लेने के लिए जा रहे हैं। ऑटोकॉमिट के ऊपरी भाग को प्रत्येक चयन कथन पर एक (बहुत ही मामूली) निश्चित ओवरहेड होना चाहिए, यह सुनिश्चित करने के लिए कि डेटा अखंडता और आपके एप्लिकेशन की स्थिरता बनाए रखा जाए।

2

यह एक पुरानी सवाल है, लेकिन मैं इस मुद्दे पर एक अलग राय दे देना चाहता था।

प्रदर्शन

लेनदेन से प्रदर्शन भूमि के ऊपर संगामिति नियंत्रण तंत्र के साथ बदलता रहता है: सामान्य रूप से बहु संस्करण संगामिति नियंत्रण या ताला। अन्य उत्तरों में व्यक्त की गई चिंता लेनदेन को समाप्त करने की लागत से कम है, लेकिन मेरे अनुभव में सबसे बड़ा दर्द लंबे समय से चलने वाले लेनदेन है, जो प्रदर्शन की बाधाओं का कारण बन सकता है। उदाहरण के लिए, यदि डीबीएमएस लॉकिंग का उपयोग करता है, तो तालिका के कुछ हिस्सों को अपडेट नहीं किया जा सकता है जब तक उस तालिका को शामिल करने वाले लेनदेन को समाप्त नहीं किया जाता है। ओरेकल जैसे सिस्टम में अधिक निराशाजनक यह है कि डीडीएल ऑपरेशंस (ALTER TABLE इत्यादि) को तब तक इंतजार करना पड़ता है जब तक कि उस तालिका का उपयोग करके सभी लेन-देन समाप्त नहीं हो जाते हैं, जिससे परेशानी का समय लगता है। तो अगर आप SELECT एस का उपयोग कर रहे हैं तो अपने लेनदेन का कोई दंड नहीं है।

कन्वेंशनों

autocommit व्यवहार बंद स्थापित करने के साथ एक सूक्ष्म समस्या यह है कि आप डिफ़ॉल्ट से बदल रहे हैं, तो किसी और को अपने कोड के साथ काम कर यह उम्मीद नहीं की जा सकती है। यह वास्तव में आसान एक फ़ंक्शन के माध्यम से एक आकस्मिक पथ छोड़ने के लिए एक स्पष्ट commit या rollback के साथ समाप्त नहीं होता है, और इससे बाद में ज्ञात कार्यों में अप्रत्याशित व्यवहार हो सकता है। इसके विपरीत, मैंने देखा है कि डीबी-इंटरफेसिंग कोड का एक बड़ा हिस्सा प्रत्येक फंक्शन के भीतर एक ही कथन है, जिसके लिए ऑटोोकॉमिट व्यवहार बहुत उपयुक्त है। असल में मैंने जो बहु-कथन कार्यों का सामना किया है, उन्हें थोड़ा और एसक्यूएल के साथ एकल कथन के रूप में फिर से लिखा जा सकता है - जावा में लागू होने के लिए खराब अनुमान कमजोर हैं।

मेरे निजी पसंद, उचित अनुभव के आधार पर, के रूप में एक डेटाबेस के लिए कॉल करने के लिए किसी भी कार्य के लिए इस प्रकार है: ऑन-प्रतिबद्ध ऑटो

  • के डिफ़ॉल्ट JDBC व्यवहार करने के लिए रखना;
  • जब अपने कार्य एक से अधिक SQL विवरण भी शामिल है, प्रत्येक कार्य के शुरू में setAutocommit(false) की स्थापना और commit() (या rollback() यदि उपयुक्त हो) अंत में, और आदर्श catch ब्लॉक में rollback() को फोन करके एक स्पष्ट लेन-देन का उपयोग करें;
  • finally ब्लॉक कि अपने JDBC- समारोह में कॉल लपेटता में setAutocommit(true) डालकर डिफ़ॉल्ट लागू (जैसे PHP/पीडीओ के रूप में एपीआई के विपरीत, JDBC के बाद commit()/rollback() आप के लिए यह काम नहीं चलेगा);
  • यदि आप अतिरिक्त रक्षात्मक महसूस कर रहे हैं, तो प्रत्येक कार्य की शुरुआत में setAutocommit(true) या setAutocommit(false) की अपनी पसंद स्पष्ट रूप से सेट करें;
+0

"ऑटो-प्रतिबद्धता के डिफ़ॉल्ट जेडीबीसी व्यवहार को जारी रखें" - वास्तव में उस दृष्टिकोण से सहमत नहीं हैं। जावा कोड लिखते समय मैं इसे हमेशा बंद कर देता हूं, आप यहां कारणों से संदर्भित कर सकते हैं क्यों: https://asktom.oracle.com/pls/asktom/f?p=100:11TP:::P11_QUESTION_ID:433819661301 यहां तक ​​कि एक कथन लेनदेन, इसे बंद रखने के लिए बस स्पष्ट है और लेनदेन पर ग्राहक कोड का पूरा नियंत्रण होने दें। – dcp

+0

@ डीसीपी निर्भर करता है कि आप लेनदेन को कितनी अच्छी तरह समझते हैं। बहुत से लोग नहीं करते हैं, लेकिन फिर भी डेटाबेस के साथ काम करने के लिए कोड लिखते हैं (वहां सभी दीपक ढेर के बारे में सोचें, और रूबी में सभी रैपर कोड जो लेनदेन संबंधी व्यवहार को छुपाते हैं)। ऑटो प्रतिबद्ध काम पर दिखाई देने वाले बयानों की हानिकारक बग से बचें लेकिन सत्रों के बीच जारी नहीं रहें। – beldaz

+1

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

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