मैं डेटाबेस कनेक्शन पूलिंग को लागू करने की कोशिश कर रहा हूं। किसी कारण से, जब मैं एकाधिक थ्रेड का उपयोग करता हूं तो मुझे यादृच्छिक रूप से अपवाद मिलते हैं।
जब मेरे पास केवल एक है, तो सब कुछ ठीक है।साथ ही कम से कम जब मैं परीक्षण कर रहा होता हूं, तो समस्याएं शुरुआत में ही दिखाई देती हैं। जैसा कि मुझे यकीन नहीं है कि उनके कारण क्या हैं, मैं वास्तव में यह सुनिश्चित नहीं कर सकता कि वे बाद में भी नहीं होंगे।
c3p0 संस्करण 0.9.5.2 . का उपयोग करना
Example output from my test: https://pastebin.com/NrcR6mhz
इस परीक्षण में 3 धागे हैं जो प्रत्येक 1000 बार सरल क्वेरी चलाते हैं। मैंने आउटपुट को छोटा कर दिया, क्योंकि बाद में कोई अपवाद नहीं है।
टीएल; डॉ संस्करण के लिए त्रुटि संदेश:
- आप बंद स्टेटमेंट पर काम नहीं कर सकते !!!
- आप बंद कनेक्शन पर काम नहीं कर सकते !!!
मैंने पूरी परियोजना को अपलोड करने की जहमत नहीं उठाई, क्योंकि डीबी अलग से कॉन्फ़िगर किया गया है। हालांकि, आप मेरी सभी कक्षाओं का कोड यहां देख सकते हैं:
Main - https://pastebin.com/1Rgjr8H5
Pool conf https://pastebin.com/wtbw1X5v
Controller https://pastebin.com/BvPh0guY
जैसा कि c3p0 सभ्य पुस्तकालय imho लगता है, मुझे लगता है कि मैं यहाँ कुछ गलत कर रहा हूँ। कोई सुझाव कृपया?
उत्तर:
जवाब के लिए 0 № 1तो, आपको थोड़ा सोचने की ज़रूरत है कि कैसेमल्टीथ्रेडेड कोडिंग काम करता है, क्यों किसी को अक्सर स्थानीय क्षेत्रों में उदाहरण या स्थिर सदस्य चर के लिए सुलभ वस्तुओं को प्राथमिकता देनी चाहिए, और जब किसी को उन वस्तुओं की सुरक्षित पहुंच के लिए सिंक्रनाइज़ करना चाहिए जिन्हें थ्रेड्स के बीच साझा किया जाना चाहिए।
आपका सबसे बुनियादी मुद्दा यह है कि MariaController.connection
एक स्थिर सदस्य चर है, जब यह पूरी तरह से स्थानीय होना चाहिए isPlayerSuspended(...)
.
आपको स्थैतिक को भी चिह्नित करना चाहिए MariaConnectionPool.getInstance()
तरीका synchronized
[ जो कॉड के शरीर को घेरने के बराबर है synchronized( MariaConnectionPool.class ){ ... }
]।
अन्य मुद्दे भी हो सकते हैं।मल्टीथ्रेडेड कोड लिखने के लिए आवश्यक है कि आप इस बारे में सावधानी से सोचें कि क्या साझा किया जा सकता है और कब, और अक्सर इसका उत्तर केवल स्थानीय संदर्भों के माध्यम से सुलभ वस्तुओं में इसके साथ काम करके परिवर्तनशील स्थिति को साझा करना है (जिस तक पहुंच स्वाभाविक रूप से सिंगल-थ्रेडेड है)।