जैसा कि मैंने पहले टिप्पणी की थी, ऐसा इसलिए है क्योंकि खुले और डेटाबेस से जुड़े सॉकेट को पता नहीं है कि कनेक्शन खो गया है, इसलिए वे तब तक जुड़े रहे जब तक ओएस सॉकेट टाइमआउट ट्रिगर नहीं हो जाता, जिसे मैंने पढ़ा है आमतौर पर लगभग 30 मिनट में हो सकता है ।
समस्या को हल करने के लिए आपको सॉकेटटाइमआउट को परिभाषित करने के लिए अपने JDBC कनेक्शन स्ट्रिंग में या JDNI कनेक्शन कॉन्फ़िगरेशन/गुणों में सॉकेट टाइमआउट को ओवरराइड करने की आवश्यकता है। एक छोटे समय के लिए परम।
ध्यान रखें कि परिभाषित मान से अधिक लंबा कोई भी कनेक्शन नष्ट हो जाएगा, भले ही इसका उपयोग किया जा रहा हो (मैं इसकी पुष्टि नहीं कर पाया, जो मैंने पढ़ा है)।
मेरी टिप्पणी में मेरे द्वारा उल्लिखित अन्य दो पैरामीटर हैं connectTimeout और ऑटो रीकनेक्ट ।
यहाँ मेरी JDBC कनेक्शन स्ट्रिंग है:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
मैंने जावा के डीएनएस कैशे को भी अक्षम कर दिया है
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
मैं ऐसा इसलिए करता हूं क्योंकि जावा टीटीएल का सम्मान नहीं करता है, और जब विफलता होती है, तो डीएनएस वही होता है लेकिन आईपी बदल जाता है।
चूंकि आप एक एप्लिकेशन सर्वर का उपयोग कर रहे हैं, इसलिए DNS कैश को अक्षम करने के पैरामीटर को -Dnet के साथ ग्लासफ़िश शुरू करते समय JVM को पास किया जाना चाहिए, न कि एप्लिकेशन को।