टॉस्कैट या बाहरी रूप से JDBC कनेक्टर के माध्यम से mysql से कनेक्ट करने में असमर्थ


17

मैंने एक स्टॉक mysql 5.5 इंस्टालेशन स्थापित किया है, और जब मैं mysql कमांड के माध्यम से mysql सेवा से कनेक्ट कर सकता हूं, और सेवा चल रही लगती है, तो मैं इसे स्प्रिंग + tomcat या बाहरी jdcc कनेक्टर से कनेक्ट नहीं कर सकता।

मैं निम्नलिखित URL का उपयोग कर रहा हूं:

jdbc:mysql://myserver.com:myport/mydb

उचित उपयोगकर्ता नाम / पासवर्ड के साथ, लेकिन मुझे निम्न संदेश प्राप्त होता है:

server.com: 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.

और टॉमकैट फेंकता है:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

यह वही मुद्दा लगता है जैसे कि मैं बाहरी रूप से जुड़ने की कोशिश करता हूं।


मुझे इस समस्या का सामना करना पड़ा जब मैं अपने mysql डेटाबेस में जावा से जुड़ने की कोशिश कर रहा था जो मेरे LAN में किसी अन्य सर्वर पर चलता है। सर्वर पर वही जावा प्रोग्राम निष्पादित करते समय जो mysql को चलाता है वह बिना किसी समस्या के कनेक्ट हो रहा था। बाहरी मशीन से मैं उदाहरण के लिए SQLYog का उपयोग करके mysql डेटाबेस से कनेक्ट कर सकता हूं (हालांकि मुझे पहली बार 127.0.0.1 के बजाय 0.0.0.0 को बाइंड करने के लिए my.cnf फ़ाइल को बदलना पड़ा)। बॉडेन के जवाब और जेडीबीसी कनेक्टर को बदलने के बारे में टिप्पणी ने मुझे सही दिशा में इशारा किया। मैंने JDBC कनेक्टर को नवीनतम संस्करण में बदल दिया और अचानक यह काम कर गया!
user2380870

जवाबों:


18

यह कई कारणों से हो सकता है। मैंने अभी कुछ हफ्ते पहले इसे खुद देखा था लेकिन मुझे याद नहीं है कि मेरे लिए क्या फिक्स था।

1) सत्यापित करें कि पता mysql के लिए बाध्य है, यह शायद 127.0.0.1 (केवल) है जो मेरा मानना ​​है कि डिफ़ॉल्ट है (कम से कम मानक उबंटू सर्वर पर)। आपको सभी उपलब्ध पतों पर बाइंड करने के लिए my.cnf में बाइंड-एड्रेस पैरामीटर पर टिप्पणी करनी होगी (आप एक से अधिक नहीं चुन सकते, यह एक या सभी है)।

2) यदि यह 127.0.0.1 से जुड़ा है और आप "लोकलहोस्ट" का उपयोग करके कनेक्ट नहीं कर सकते हैं, तो सुनिश्चित करें कि यह IPv4 के बजाय IPv6 लोकलहोस्ट पते पर हल नहीं हो रहा है। (या सिर्फ आईपी पते का उपयोग करें)

3) mysql जिस पोर्ट पर सुन रहा है, उसे डबल और ट्रिपल-चेक करें।

4) सुनिश्चित करें कि आप अपने JDK के लिए सही JDBC कनेक्टर का उपयोग कर रहे हैं।

5) सुनिश्चित करें कि आप वास्तव में मूर्खतापूर्ण कुछ नहीं कर रहे हैं जैसे mysql को --skip-नेटवर्किंग के साथ शुरू करना।

मुझे लगता है कि मेरे पहले सुझाव में सबसे अधिक वादा किया गया है ... वास्तव में मुझे लगता है कि जहां मैंने इसे हाल ही में देखा है ... मैं दूरस्थ रूप से (Ubuntu 8.04 पर भी) mysql से जुड़ने की कोशिश कर रहा था।


बस अपने 2cent को जोड़ने के लिए, 4 वें ने मेरे लिए काम किया। धन्यवाद!
Janis Peisenieks

1
"आपको सभी उपलब्ध पतों पर बाइंड करने के लिए my.cnf में बाइंड-एड्रेस पैरामीटर पर टिप्पणी करनी होगी" के बारे में, डिफ़ॉल्ट अब केवल स्थानीयहोस्ट पर सुनना है, इसलिए आपको लाइन "बाइंड-एड्रेस = 0.0" का उपयोग करने की आवश्यकता हो सकती है। 0.0 "के भीतर [mysqld]।
पालो

13

मुझे अपने दो कार्यक्रमों में भी यही समस्या रही है। मेरी त्रुटि यह थी:

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/my.cnf

  • Windows: D: \ Program Files \ mysql \ bin \ my.ini

यहाँ समाधान हैं:

  • "बाइंड-एड्रेस" विशेषता को बदलना

Uncomment "बाइंड-एड्रेस" विशेषता या इसे निम्नलिखित Ips में से एक में बदलें:

बाँध-पता = "127.0.0.1"

या

बाँध-पता = "0.0.0.0"

  • "स्किप-नेटवर्किंग" पर टिप्पणी करना

अगर आपकी MySQL कॉन्फिगर फाइल में "स्किप-नेटवर्किंग" लाइन है, तो उस लाइन की शुरुआत में "#" साइन जोड़कर टिप्पणी करें।

  • "प्रतीक्षा_टाइम" और "इंटरैक्टिव_टाइमआउट" बदलें

इन पंक्तियों को MySQL config फाइल में जोड़ें:

Wait_timeout = संख्या

इंटरैक्टिव_टाइम = संख्या

connect_timeout = संख्या

  • ऑपरेटिंग सिस्टम प्रॉक्सी सेटिंग्स की जाँच करें

सुनिश्चित करें कि फायर वॉल, या एंटी वायरस सॉफ्ट वेयर MySQL सर्विस को ब्लॉक नहीं करते हैं।

  • कनेक्शन स्ट्रिंग बदलें

अपने क्वेरी स्ट्रिंग की जाँच करें। आपका कनेक्शन स्ट्रिंग कुछ इस तरह होना चाहिए:

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 और JREs का परीक्षण करें (जैसे JDK 6 और 7)
  • max_allowed_packet को न बदलें

" max_allowed_packet " MySQL config फाइल में एक चर है जो अधिकतम पैकेट आकार को इंगित करता है, पैकेट की अधिकतम संख्या को नहीं। तो यह इस त्रुटि को हल करने में मदद नहीं करेगा।

  • टॉमकैट सुरक्षा बदलें

TOMCAT6_SECURITY = हां को TOMCAT6_SECURITY = नहीं में बदलें

  • सत्यापन प्रॉपर्टी का उपयोग करें

सत्यापन का उपयोग करें = "अब चयन करें ()" यह सुनिश्चित करने के लिए कि प्रत्येक क्वेरी में प्रतिक्रियाएं हैं

  • अपने आप जुड़ना

इस कोड को अपने कनेक्शन स्ट्रिंग में जोड़ें:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

हालांकि इन समाधानों में से कोई भी मेरे लिए काम नहीं करता, मैं आपको उन्हें आजमाने का सुझाव देता हूं। क्योंकि कुछ लोग हैं कि इन चरणों का पालन करने के साथ उनकी समस्या को कैसे हल किया जाए।

लेकिन मेरी समस्या का हल क्या है? मेरी समस्या यह थी कि डेटाबेस पर मेरे कई चयन थे। हर बार मैंने कनेक्शन बनाया और फिर इसे बंद कर दिया। हालांकि मैंने हर बार कनेक्शन बंद कर दिया, लेकिन सिस्टम ने कई कनेक्शनों का सामना किया और मुझे वह त्रुटि दी। मैंने जो किया वह यह था कि मैंने अपने कनेक्शन चर को पूरी कक्षा के लिए एक सार्वजनिक (या निजी) चर के रूप में परिभाषित किया और इसे कंस्ट्रक्टर में इनिशियलाइज़ किया। फिर हर बार मैंने बस उस कनेक्शन का इस्तेमाल किया। इसने मेरी समस्या हल कर दी और नाटकीय रूप से मेरी गति भी बढ़ा दी।

निष्कर्ष

इस समस्या को हल करने का कोई सरल और अनोखा तरीका नहीं है। मैं आपको अपनी खुद की स्थिति के बारे में सोचने और उपरोक्त समाधान चुनने का सुझाव देता हूं। यदि आप इस त्रुटि को प्रोग्राम की शुरुआत में लेते हैं और आप डेटाबेस से कनेक्ट नहीं कर पा रहे हैं, तो आपको अपने कनेक्शन स्ट्रिंग में समस्या हो सकती है। लेकिन यदि आप डेटाबेस में कई सफल इंटरैक्शन के बाद यह त्रुटि लेते हैं, तो समस्या कनेक्शन की संख्या के साथ हो सकती है और आप "प्रतीक्षा_टाइम" और अन्य MySQL सेटिंग्स को बदलने के बारे में सोच सकते हैं या अपने कोड को फिर से लिख सकते हैं कि कनेक्शन की संख्या कैसे कम करें।


मुझे भी यह समस्या हो रही थी! लेकिन मैंने शुरू में 3306 के बजाय 8888 पोर्ट को सुनने के लिए mysql को बदल दिया था। इसलिए, @ sohail के उत्तर ने मदद की, मैंने सिर्फ अपने uri में पोर्ट 8888 जोड़ा और यह काम कर गया! धन्यवाद एक गुच्छा

इससे मेरे लिए समस्या हल हो गई! हमारे वैग्रांट होमस्टेड सेटअप के साथ यह किसी कारण से लोकलहोस्ट के बजाय वीएम (मेरे मामले में 10.0.2.15) के पते पर बाध्यकारी था।
लैंडर

1

यदि आप एक लिनक्स इंस्टॉलेशन चला रहे हैं, तो संभवतः आपके पास एसएसएच के अलावा आने वाले संचारों को अवरुद्ध करने वाला लॉकेट है।

रूट के रूप में लॉग इन करें, और प्रॉम्प्ट से कमांड लोकेट को चलाएं, फ़ायरवॉल और सेलाइनक्स को अक्षम करें और देखें कि क्या आपके पास भी यही समस्या है।

यह भी जांचें कि आपकी अनुमतियां सही तरीके से सेट की गई हैं, इसलिए सब कुछ सही स्थानों पर लिख सकते हैं।


मैं Ubuntu 8.04 चला रहा हूं। मुझे शायद इसका उल्लेख करना चाहिए था। क्या आपके पास उस डिस्ट्रो के लिए विशिष्ट निर्देश हैं? मैं एक पल में गूगल करूंगा, लेकिन मुझे लगा कि मैं पहले पूछूंगा।
स्टीफन केंडल

sudo ufw निष्क्रिय कर देगा Ubuntu Firewall
स्टीफन थॉम्पसन

मैंने ufw स्थापित किया और पोर्ट को सक्षम करने का प्रयास किया, लेकिन कोई पासा नहीं।
स्टीफन केंडल

ufw और iptables पहले से ही अनइंस्टॉल थे। मुझे लगा कि ufw एक प्रबंधन उपकरण था जिसे अलग से स्थापित किया जाना था। यकीन है कि पर्याप्त, "iptables" कोई ऐसी कमांड नहीं देता है, और न ही iptables सेवा चल रही है।
स्टीफन केंडल

ठीक है कि अंत में जो चीज मुझे मिली है, वह है कि आप mysql को eth0 इंटरफ़ेस पर सुनने में सक्षम न करें, और अक्सर यह केवल लोकलहोस्ट इंटरफेस पर ही है। निम्नलिखित का प्रयास करें। चेंज jdbc: mysql: //myserver.com: myport / mydb to jdbc: mysql: // localhost: myport / mydb यदि वह काम करता है, तो आपको निम्नलिखित dev.mqql.com/doc/refman/5.1/en/en
स्टीफन थॉम्पसन


1

यह गलत प्रॉक्सी सेटिंग के कारण भी हो सकता है । मैं इस समस्या को jdbc के माध्यम से कनेक्ट करने की कोशिश कर रहा था एक MySQL उदाहरण के लिए अपने मैक पर एक समानताएं आभासी उपकरण में चल रहा है। Jdbc कनेक्शन सिस्टम-स्तरीय नेटवर्क सेटिंग्स का उपयोग करता है और चूँकि मैं SOCKS प्रॉक्सी के पीछे था इसलिए मुझे MySql होस्ट को एक गैर-प्रॉक्सी होस्ट के रूप में सेट करना पड़ा (उदाहरण के लिए, मैक पर आप सेटिंग में कॉन्फ़िगर कर सकते हैं- > नेटवर्क): उन्नत > प्रॉक्सी, और अंत में "इन होस्ट और डोमेन के लिए बायपास प्रॉक्सी सेटिंग्स" में होस्टनाम या आईपी एड्रेस जोड़ें।)।


1

MySQL कनेक्टर / J केवल TCP / IP जावा का समर्थन करता है जो यूनिक्स डोमेन सॉकेट कनेक्टिविटी का समर्थन नहीं करता है

यदि MYSQL को स्किप-नेटवर्किंग फ्लैग के साथ शुरू किया जाता है या यदि MySQL फ़ायरवॉल के पीछे चल रहा है, तो TCP / IP विकल्प अक्षम है। ताकि जावा MySQL के साथ संवाद न कर सके।


0

मुझे लगभग एक दिन के लिए एक समान समस्या थी, और इसने मुझे पागल कर दिया! लेकिन मैं समाधान खोजने में कामयाब रहा, और यह बहुत, बहुत सरल था, आपको TOMCAT6_SECURITY = हां को TOMCAT6_SECURITY = हां में बदलने के लिए बस /etc/init.d/tomcat6 की आवश्यकता है। यह मेरा समाधान नहीं है, मैंने इसे यहां पाया , जैसा कि आप देख सकते हैं, मैं ubuntu चला रहा हूं, आशा है कि यह काम करेगा।


0

मुझे भी यही समस्या थी। /Etc/mysql/my.cnf फ़ाइल में "बाइंड-एड्रेस" प्रॉपर्टी को 0.0.0.0 में बदल दिया, और यह काम करता है। इस तरह दिखता है my.cnf में अनुरूपण रेखा:

बाइंड-पता = 0.0.0.0

इससे पहले कि यह सर्वर के बाहरी आईपी पते पर सेट किया गया था, इसलिए यह कुछ ऐसा दिखता था:

बाइंड-पता = 196.152.4.145

मुझे लगता है कि जब यह बाहरी आईपी पते पर सेट होता है और लोकलहोस्ट लूप नहीं होता है, तो mysql सर्वर सिर्फ नेटवर्क कार्ड से जुड़ा होता है और स्थानीय लूप से कनेक्शन नहीं सुनता है।


0

अपने स्थानीय पते को my.cnf फ़ाइल में पता बाँधने का प्रयास करें

कनेक्शन con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.