मुझे अपने दो कार्यक्रमों में भी यही समस्या हुई है। मेरी त्रुटि यह थी:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
मैंने इस समस्या को हल करने के लिए कई दिन बिताए। मैंने कई दृष्टिकोणों का परीक्षण किया है जिनका उल्लेख विभिन्न वेब साइटों में किया गया है, लेकिन उनमें से कोई भी काम नहीं करता है। अंत में मैंने अपना कोड बदल दिया और पता चला कि समस्या क्या थी। मैं आपको अलग-अलग तरीकों के बारे में बताने की कोशिश करूंगा और उन्हें यहां संक्षेप में बताऊंगा ।
जब मैं इस त्रुटि का समाधान खोजने के लिए इंटरनेट खोज रहा था, मुझे पता चला कि ऐसे कई समाधान हैं जो कम से कम एक व्यक्ति के लिए काम करते हैं, लेकिन अन्य कहते हैं कि यह उनके लिए काम नहीं करता है! इस त्रुटि के कई तरीके क्यों हैं? ऐसा लगता है यह त्रुटि हो सकती है आम तौर पर जब सर्वर से कनेक्ट होने में कोई समस्या हो . शायद समस्या गलत क्वेरी स्ट्रिंग या डेटाबेस से बहुत अधिक कनेक्शन के कारण है।
इसलिए मेरा सुझाव है कि आप सभी समाधानों को एक-एक करके आजमाएं और हार न मानें!
यहां वे समाधान हैं जो मैंने इंटरनेट पर पाए और उनमें से प्रत्येक के लिए, कम से कम उस व्यक्ति पर है जिसने उस समाधान से उसकी समस्या का समाधान किया है।
युक्ति:उन समाधानों के लिए जिन्हें आपको MySQL सेटिंग्स बदलने की आवश्यकता है, आप निम्न फ़ाइलों का संदर्भ ले सकते हैं:
-
लिनक्स:
/etc/mysql/my.cnf
या/etc/my.cnf
(लिनक्स वितरण और उपयोग किए गए MySQL पैकेज के आधार पर) -
विंडोज़:
C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini
(ध्यान दें कि यह प्रोग्रामडेटा है, प्रोग्राम फ़ाइलें नहीं)
यहां समाधान दिए गए हैं:
-
bind-address
बदल रहा है विशेषता:bind-address
पर टिप्पणी न करें विशेषता दें या इसे निम्न IP में से किसी एक में बदलें:bind-address="127.0.0.1"
या
bind-address="0.0.0.0"
-
"स्किप-नेटवर्किंग" पर टिप्पणी करना
अगर कोई
skip-networking
है अपनी MySQL कॉन्फ़िग फ़ाइल में लाइन,#
. जोड़कर टिप्पणी करें उस पंक्ति की शुरुआत में हस्ताक्षर करें। -
"wait_timeout" और "interactive_timeout" बदलें
इन पंक्तियों को MySQL कॉन्फ़िग फ़ाइल में जोड़ें:
[wait_timeout][1] = *number* interactive_timeout = *number* connect_timeout = *number*
-
सुनिश्चित करें कि Java 'लोकलहोस्ट' का अनुवाद [127.0.0.1] के बजाय [:::1] में नहीं कर रहा है
चूंकि MySQL
127.0.0.1
. को पहचानता है (IPv4
) लेकिन नहीं:::1
(IPv6
)दो तरीकों में से एक का उपयोग करके इससे बचा जा सकता है:
-
कनेक्शन स्ट्रिंग में
127.0.0.1
. का उपयोग करेंlocalhost
के बजायlocalhost
से बचने के लिए:::1
. में अनुवाद किया जा रहा है -
विकल्प के साथ जावा चलाएँ
-Djava.net.preferIPv4Stack=true
जावा कोIPv4
का उपयोग करने के लिए बाध्य करने के लिएIPv6
. के बजाय . Linux पर, इसे चलाकर (या/etc/profile
. के अंदर रखकर भी हासिल किया जा सकता है :export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
-
-
ऑपरेटिंग सिस्टम प्रॉक्सी सेटिंग्स, फायरवॉल और एंटी-वायरस प्रोग्राम जांचें
सुनिश्चित करें कि फ़ायरवॉल, या एंटी-वायरस सॉफ़्टवेयर MySQL सेवा को अवरुद्ध नहीं कर रहा है।
iptables को अस्थायी रूप से linux पर रोकें। यदि iptables गलत कॉन्फ़िगर किए गए हैं तो वे tcp पैकेट को mysql पोर्ट पर भेजने की अनुमति दे सकते हैं, लेकिन tcp पैकेट को उसी कनेक्शन पर वापस आने से रोक सकते हैं।
# Redhat enterprise and CentOS systemctl stop iptables.service # Other linux distros service iptables stop
विंडोज़ पर एंटी-वायरस सॉफ़्टवेयर बंद करें।
-
कनेक्शन स्ट्रिंग बदलें
अपनी क्वेरी स्ट्रिंग जांचें। आपकी कनेक्शन स्ट्रिंग कुछ इस तरह होनी चाहिए:
dbName = "my_database"; dbUserName = "root"; dbPassword = ""; String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
सुनिश्चित करें कि आपके स्ट्रिंग में रिक्त स्थान नहीं हैं। सभी कनेक्शन स्ट्रिंग बिना किसी स्पेस कैरेक्टर के जारी रहनी चाहिए।
"लोकलहोस्ट" को लूपबैक एड्रेस 127.0.0.1 से बदलने का प्रयास करें। अपने कनेक्शन स्ट्रिंग में पोर्ट नंबर जोड़ने का भी प्रयास करें, जैसे:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
आमतौर पर MySQL के लिए डिफ़ॉल्ट पोर्ट 3306 है।
उपयोगकर्ता नाम और पासवर्ड को अपने MySQL सर्वर के उपयोगकर्ता नाम और पासवर्ड में बदलना न भूलें।
- अपनी JDK ड्राइवर लाइब्रेरी फ़ाइल अपडेट करें
- विभिन्न JDK और JRE का परीक्षण करें (जैसे JDK 6 और 7)
- max_allowed_packet न बदलें
"max_allowed_packet " MySQL कॉन्फ़िगरेशन फ़ाइल में एक वैरिएबल है जो अधिकतम पैकेट आकार को इंगित करता है, न कि अधिकतम संख्या में पैकेट। इसलिए यह इस त्रुटि को हल करने में मदद नहीं करेगा।
- टॉमकैट सुरक्षा बदलें
TOMCAT6_SECURITY=हां को TOMCAT6_SECURITY=no
में बदलें- सत्यापन क्वेरी प्रॉपर्टी का उपयोग करें
यह सुनिश्चित करने के लिए कि प्रत्येक क्वेरी में प्रतिक्रियाएँ हैं, सत्यापन क्वेरी ="अभी चुनें ()" का उपयोग करें
- स्वतः पुन:कनेक्ट करें
इस कोड को अपनी कनेक्शन स्ट्रिंग में जोड़ें:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
हालाँकि इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया, मेरा सुझाव है कि आप उन्हें आज़माएँ। क्योंकि कुछ लोग हैं जिन्होंने इन चरणों का पालन करके अपनी समस्या का समाधान किया है।
लेकिन मेरी समस्या का समाधान क्या हुआ?
मेरी समस्या यह थी कि मेरे पास डेटाबेस पर कई चयन थे। हर बार मैं एक कनेक्शन बना रहा था और फिर उसे बंद कर रहा था। हालाँकि मैं हर बार कनेक्शन बंद कर रहा था, लेकिन सिस्टम ने कई कनेक्शनों का सामना किया और मुझे वह त्रुटि दी। मैंने जो किया वह यह था कि मैंने अपने कनेक्शन चर को पूरी कक्षा के लिए एक सार्वजनिक (या निजी) चर के रूप में परिभाषित किया और इसे निर्माता में प्रारंभ किया। फिर हर बार मैंने बस उस कनेक्शन का इस्तेमाल किया। इसने मेरी समस्या का समाधान किया और मेरी गति में भी नाटकीय रूप से वृद्धि की।
#निष्कर्ष#इस समस्या को हल करने का कोई सरल और अनोखा तरीका नहीं है। मेरा सुझाव है कि आप अपनी स्थिति के बारे में सोचें और उपरोक्त समाधान चुनें। यदि आप प्रोग्राम की शुरुआत में यह त्रुटि लेते हैं और आप डेटाबेस से बिल्कुल भी कनेक्ट नहीं हो पा रहे हैं, तो आपको अपने कनेक्शन स्ट्रिंग में समस्या हो सकती है। लेकिन यदि आप डेटाबेस में कई सफल अंतःक्रियाओं के बाद यह त्रुटि लेते हैं, तो समस्या कनेक्शन की संख्या के साथ हो सकती है और आप "wait_timeout" और अन्य MySQL सेटिंग्स को बदलने के बारे में सोच सकते हैं या अपने कोड को फिर से लिख सकते हैं कि कैसे कनेक्शन की संख्या कम हो जाती है।