C3p0

2009-03-16 9 views
5

में लॉक ऑर्डरिंग मैं c3p0 के ConnectionCustomizer का उपयोग करके हमारे एप्लिकेशन में डेटाबेस कनेक्शन के निर्माण और विनाश को लॉग करने का प्रयास कर रहा हूं। इसमें, मेरे पास कुछ कोड है जो इस तरह दिखता है:C3p0

log(C3P0Registry.getPooledDataSources()) 

मैं डेडलॉक्स में दौड़ रहा हूं। मुझे पता चल रहा है कि c3p0 में कम से कम कुछ ऑब्जेक्ट्स हैं जो इसकी लाइब्रेरी में सिंक्रनाइज़ किए गए तरीकों का उपयोग करती हैं, और ऐसा लगता है कि वे अपने इच्छित लॉक ऑर्डरिंग को निर्दिष्ट नहीं करते हैं। जब मैं कनेक्शन लॉग करता हूं, तो मुझे C3P0Registry पर लॉक हो रहा है और अंत में PoolBackedDataSource (बस डेटा स्रोतों की एक सूची बनाना हैकोड को लॉक के कारण एक्सेस कर रहा है)।

कनेक्शन प्रदाता को बंद करना (C3P0ConnectionProvider.close() पर कॉल करना) ताले को विपरीत क्रम में बुलाया जाता है। लेकिन जब बच्चे डेटा स्रोत बंद हो रहे हैं, तो मेरा लॉगिंग ट्रिगर किया जा रहा है। नतीजा एक डेडलॉक है।

यह दोनों कॉल मैं कर रहे हैं वैध, उम्मीद कॉल c3p0 पुस्तकालय में बनाने रहा हूँ की तरह लगता है:

  • C3P0ConnectionProvider.close()
  • C3P0Registry.getPooledDataSources()

यह भी की तरह लगता है (जब तक स्पष्ट दस्तावेज में कहा गया है) यह अपनी खुद की लॉकिंग रणनीति का प्रबंधन करने के लिए लाइब्रेरी की ज़िम्मेदारी होनी चाहिए। (मैं इसे किसी को दोष देने के लिए नहीं कहता .. बस सर्वोत्तम प्रथाओं की मेरी समझ की पुष्टि करने के लिए)

मुझे इस मुद्दे से कैसे निपटना चाहिए? चूंकि c3p0 अधिक आधुनिक तंत्र की बजाय सिंक्रनाइज़ किए गए तरीकों का उपयोग करता है, इसलिए मैं वास्तव में ताले का परीक्षण नहीं कर सकता।

मेरे DataSource समापन कोड से, मैं पहले DataSource बंद करने से पहले C3P0Registry लॉक ले सकता था। मैं सही लॉक ऑर्डर पर अनुमान लगा रहा हूं, जो मुझे नहीं पता कि मुझे सहज महसूस होता है या नहीं।

मुझे नहीं लगता कि मैं लॉगिंग कॉल के लिए लॉक ऑर्डर को उलट सकता हूं। DataSources की सूची प्राप्त करने के लिए मुझे C3P0Registry की आवश्यकता है, इसलिए मैं को लॉक करने के बिना DataSources लॉक नहीं कर सका।

एक और समाधान, निश्चित रूप से सब कुछ c3p0 से ऊपर एक और उच्च स्तर का लॉक प्रदान करना है। एक कनेक्शन पूल के मामले में, यह बिंदु को हराने के लिए लगता है।

अभी के लिए, मैं अपना लॉगिंग वापस रोल कर रहा हूं। किसी भी मदद के लिए धन्यवाद।

+0

इस तरह के बारे में अधिक जानकारी प्राप्त करने के लिए, इस तरह की कुछ दिलचस्पी का अनुभव करना। –

+0

मैं कोड के चारों ओर एक सिंक्रनाइज़ ब्लॉक जोड़ रहा हूं जो गारंटी देता है() गारंटी देता है कि मैं अपने लॉगिंग के समान ताले में ताले प्राप्त कर रहा हूं। यह मैला है, लेकिन फिर, सी 3 पी 0 में लॉकिंग रणनीति भी है। –

उत्तर

0

मुझे नहीं पता कि लॉकिंग समस्या को कैसे ठीक किया जाए, लेकिन मुझे लगता है कि आपको यहां एक कदम वापस लेना चाहिए और मूल समस्या के बारे में सोचना चाहिए। "मैं अपने आवेदन में डेटाबेस कनेक्शन के निर्माण और विनाश को लॉग करने की कोशिश कर रहा हूं ..."

मैं निम्नलिखित की अनुशंसा करता हूं।

कक्षा बनाएं और इसे javax.sql.DataSource लागू करें। उसी प्रकार का एक फ़ील्ड बनाएं और इसके सभी विधियों को प्रतिनिधि दें। getConnection() विधि में java.sql.Connection और इसी तरह के अपने स्वयं के कनेक्शन वर्ग को लपेटें। फिर इस कक्षा को अपने मूल डेटा स्रोत के चारों ओर लपेटें। अपनी कक्षाओं में आप अब केवल लॉगजर बना सकते हैं और अपने लॉग में देखे जाने वाले सभी कार्यों को लॉग कर सकते हैं।

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