में लॉक ऑर्डरिंग मैं c3p0 के ConnectionCustomizer
का उपयोग करके हमारे एप्लिकेशन में डेटाबेस कनेक्शन के निर्माण और विनाश को लॉग करने का प्रयास कर रहा हूं। इसमें, मेरे पास कुछ कोड है जो इस तरह दिखता है:C3p0
log(C3P0Registry.getPooledDataSources())
मैं डेडलॉक्स में दौड़ रहा हूं। मुझे पता चल रहा है कि c3p0 में कम से कम कुछ ऑब्जेक्ट्स हैं जो इसकी लाइब्रेरी में सिंक्रनाइज़ किए गए तरीकों का उपयोग करती हैं, और ऐसा लगता है कि वे अपने इच्छित लॉक ऑर्डरिंग को निर्दिष्ट नहीं करते हैं। जब मैं कनेक्शन लॉग करता हूं, तो मुझे C3P0Registry
पर लॉक हो रहा है और अंत में PoolBackedDataSource
(बस डेटा स्रोतों की एक सूची बनाना हैकोड को लॉक के कारण एक्सेस कर रहा है)।
कनेक्शन प्रदाता को बंद करना (C3P0ConnectionProvider.close()
पर कॉल करना) ताले को विपरीत क्रम में बुलाया जाता है। लेकिन जब बच्चे डेटा स्रोत बंद हो रहे हैं, तो मेरा लॉगिंग ट्रिगर किया जा रहा है। नतीजा एक डेडलॉक है।
यह दोनों कॉल मैं कर रहे हैं वैध, उम्मीद कॉल c3p0 पुस्तकालय में बनाने रहा हूँ की तरह लगता है:
C3P0ConnectionProvider.close()
C3P0Registry.getPooledDataSources()
यह भी की तरह लगता है (जब तक स्पष्ट दस्तावेज में कहा गया है) यह अपनी खुद की लॉकिंग रणनीति का प्रबंधन करने के लिए लाइब्रेरी की ज़िम्मेदारी होनी चाहिए। (मैं इसे किसी को दोष देने के लिए नहीं कहता .. बस सर्वोत्तम प्रथाओं की मेरी समझ की पुष्टि करने के लिए)
मुझे इस मुद्दे से कैसे निपटना चाहिए? चूंकि c3p0 अधिक आधुनिक तंत्र की बजाय सिंक्रनाइज़ किए गए तरीकों का उपयोग करता है, इसलिए मैं वास्तव में ताले का परीक्षण नहीं कर सकता।
मेरे DataSource
समापन कोड से, मैं पहले DataSource
बंद करने से पहले C3P0Registry
लॉक ले सकता था। मैं सही लॉक ऑर्डर पर अनुमान लगा रहा हूं, जो मुझे नहीं पता कि मुझे सहज महसूस होता है या नहीं।
मुझे नहीं लगता कि मैं लॉगिंग कॉल के लिए लॉक ऑर्डर को उलट सकता हूं। DataSources
की सूची प्राप्त करने के लिए मुझे C3P0Registry
की आवश्यकता है, इसलिए मैं को लॉक करने के बिना DataSources
लॉक नहीं कर सका।
एक और समाधान, निश्चित रूप से सब कुछ c3p0 से ऊपर एक और उच्च स्तर का लॉक प्रदान करना है। एक कनेक्शन पूल के मामले में, यह बिंदु को हराने के लिए लगता है।
अभी के लिए, मैं अपना लॉगिंग वापस रोल कर रहा हूं। किसी भी मदद के लिए धन्यवाद।
इस तरह के बारे में अधिक जानकारी प्राप्त करने के लिए, इस तरह की कुछ दिलचस्पी का अनुभव करना। –
मैं कोड के चारों ओर एक सिंक्रनाइज़ ब्लॉक जोड़ रहा हूं जो गारंटी देता है() गारंटी देता है कि मैं अपने लॉगिंग के समान ताले में ताले प्राप्त कर रहा हूं। यह मैला है, लेकिन फिर, सी 3 पी 0 में लॉकिंग रणनीति भी है। –