2009-07-30 10 views
5

मैं अपनी दृढ़ता परत के रूप में हाइबरनेट समर्थित जेपीए का उपयोग कर रहा हूं। मेरे पास एक बहु-थ्रेडेड प्रक्रिया है जो साबुन कॉल से डेटा एकत्र करती है और फिर डेटाबेस में एक पंक्ति संग्रहीत करती है। आमतौर पर प्रक्रिया लगभग 700 पंक्तियों को डालने में समाप्त होती है और लगभग 1 - 3 घंटे लगती है, सोप कॉल मुख्य बाधा बनती है।मैं जेपीए आवेषण को डेटाबेस तालिका लॉक करने से कैसे रोकूं?

इस पूरे प्रक्रिया के दौरान तालिका मैं ताले में डाल रहा हूं और समय-समय पर चयन विवरण नहीं लौटाऊंगा।

Error Message: Lock request time out period exceeded.

मैं इस लंबी प्रक्रिया के दौरान मेरी डेटाबेस तालिका ताला से बचने है:

यहाँ एसक्यूएल सर्वर त्रुटि है?

उत्तर

1

क्या आप के साथ सभी 700 पंक्तियों को उसी लेनदेन के साथ सम्मिलित करते हैं?

आपकी लेनदेन सीमा कहां है? यदि आप शायद अपने लेन-देन की सीमा को कम कर सकते हैं, यानी वास्तविक डालने के संचालन को केवल लेनदेन कर दें ताकि लॉक ब्रीफली हो।

यदि आपको पूरी प्रक्रिया परमाणु होने की आवश्यकता है तो इसे एक अस्थायी तालिका में लिखने का विचार हो सकता है और फिर मुख्य तालिका में डालने के लिए एक थोक डालने (तेज़) करना एक विचार हो सकता है।

+0

मुझे मेरी लेनदेन सीमाओं के बारे में अनिश्चितता है। मेरे पास मेरे डीएओ विधियों पर @transactional है जिसके लिए एक लेनदेन की आवश्यकता है, लेकिन मेरे पास डीएओ का उपयोग कर कोड में मेरे प्रवेश बिंदु पर @transactional भी है। अगर मैं पूर्व को हटा देता हूं तो यह मुझे कोई लेनदेन त्रुटि नहीं देता है। यह कुछ ऐसा है जो मैं वर्तमान में जांच कर रहा हूं। Http://stackoverflow.com/questions/807457/ –

+0

मेरी @ ट्रान्सैक्शनल बहुत दूर थी, एक बार जब मैंने इसे हटा दिया तो प्रक्रिया डेटाबेस को लॉक किए बिना ठीक काम कर रही है। मेरे पास अभी भी कुछ अजीब मुद्दे हैं @ ट्रांसेक्शनल, लेकिन इस प्रक्रिया के लिए मैंने हल किया कि यह केवल छोटे लेनदेन पर निर्भर है। यह सवाल उपयोगी था http://stackoverflow.com/questions/1079114। –

2

आपको शायद अपने अलगाव स्तर को बदलने की जरूरत है। http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

यह अलग अलगाव स्तर के बारे में बात करती है, और वे क्या के खिलाफ गार्ड मदद कर सकते हैं:

यहाँ कुछ जानकारी है। ऐसा करने का सामान्य तरीका सख्ती से शुरू करना है, और फिर डेटा अखंडता/झूठी पठन की आवश्यकताओं को ध्यान में रखते हुए, आपको बेहतर प्रतिक्रिया समय की आवश्यकता होने पर कम हो जाएं।

संपादित

स्प्रिंग लेन-देन का स्तर लेनदेन प्रबंधक पर सार JDBC (या जो भी) लेनदेन अलगाव स्तर तक किया जाता है। उन्हें TransactionDefinition कक्षा में परिभाषित किया गया है, और स्थिर सदस्य हैं।

TransactionDefinition.ISOLATION_DEFAULT 
Default isolation 

TransactionDefinition.ISOLATION_READ_UNCOMMITTED 
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions 

TransactionDefinition.ISOLATION_READ_COMITTED 
Cannot read uncommitted data 

TransactionDefinition.ISOLATION_REPEATABLE_READ 
Ensures repeatable reads 

TransactionDefinition.ISOLATION_SERIALIZABLE 
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially. 

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

+0

और यदि आप स्प्रिंग ट्रांजैक्शन मैनेजर का उपयोग कर रहे हैं, तो जब आप लेनदेन डीएओ सेट करते हैं, तो आप प्रत्येक लेनदेन कॉल के लिए अलगाव स्तर निर्धारित कर सकते हैं। – aperkins

+0

असल में, क्या आप उस पर विस्तार कर सकते हैं या मुझे उस लेख की दिशा में इंगित कर सकते हैं जो उस पर विस्तार करता है? –

+0

ध्यान दें कि रॉब हैरोप और जन माचेस्क द्वारा संदर्भ पुस्तक "प्रो स्प्रिंग" से प्राप्त सभी वसंत जानकारी। एक बहुत ही सूखी किताब के दौरान, यह वास्तव में अच्छी सूचकांक के साथ वसंत के लिए एक अच्छा संदर्भ टुकड़ा है। यह पुस्तक थी जिसने अंततः मेरे लिए लेनदेन "क्लिक" किया - हालांकि इसमें थोड़ी देर लग गई :) – aperkins

0

क्या आप एक जेपीए लेनदेन में 700 साबुन अनुरोध करने की कोशिश कर रहे हैं? ऐसा मत करो। :-)

+0

नहीं, प्रोग्राम क्या करता है, एसओएपी कॉल परिणाम प्राप्त करता है, फिर डेटाबेस में रिपोर्ट करता है।लेनदेन वसंत द्वारा संभाला जाता है। –