com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: การเชื่อมโยงล้มเหลวในการสื่อสาร


225

ฉันทำงานเพื่อรับฐานข้อมูลของฉันเพื่อพูดคุยกับโปรแกรม Java ของฉัน

ใครสามารถให้โปรแกรมตัวอย่างที่รวดเร็วและสกปรกแก่ฉันโดยใช้ JDBC ได้หรือไม่

ฉันได้รับข้อผิดพลาดค่อนข้างน่าทึ่ง:

Exception in thread "main" 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
Caused by: 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:218)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
    ... 13 more

เนื้อหาของไฟล์ทดสอบ:

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}

17
ฉันเป็นคนโง่ เซิร์ฟเวอร์ MySQL ไม่เริ่มทำงาน :( มันประสบความสำเร็จหลังจากเริ่มใช้งาน
akfaisel

คำตอบ:


251

ดังนั้นคุณมี

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: การสื่อสารล้มเหลวในการเชื่อมต่อ
java.net.ConnectException: การเชื่อมต่อถูกปฏิเสธ

ฉันพูดจากคำตอบนี้ซึ่งยังมีการสอน MySQL + JDBC ทีละขั้นตอน:

หากคุณได้รับ a SQLException: Connection refusedหรือConnection timed outMySQL เฉพาะCommunicationsException: Communications link failureหมายความว่าฐานข้อมูลนั้นไม่สามารถเข้าถึงได้เลย อาจมีสาเหตุต่อไปนี้อย่างน้อยหนึ่งอย่าง:

  1. ที่อยู่ IP หรือชื่อโฮสต์ใน JDBC URL ไม่ถูกต้อง
  2. ชื่อโฮสต์ใน JDBC URL ไม่ได้รับการยอมรับจากเซิร์ฟเวอร์ DNS ในเครื่อง
  3. หมายเลขพอร์ตหายไปหรือไม่ถูกต้องใน JDBC URL
  4. เซิร์ฟเวอร์ DB ไม่ทำงาน
  5. เซิร์ฟเวอร์ DB ไม่ยอมรับการเชื่อมต่อ TCP / IP
  6. เซิร์ฟเวอร์ฐานข้อมูลขาดการเชื่อมต่อ
  7. บางสิ่งระหว่าง Java และ DB กำลังบล็อกการเชื่อมต่อเช่นไฟร์วอลล์หรือพร็อกซี

ในการแก้ปัญหาข้อใดข้อหนึ่งให้ทำตามคำแนะนำต่อไปนี้:

  1. pingตรวจสอบและทดสอบพวกเขาด้วย
  2. รีเฟรช DNS หรือใช้ที่อยู่ IP ใน JDBC URL แทน
  3. ตรวจสอบว่าเป็นไปตามmy.cnfMySQL DB
  4. เริ่มฐานข้อมูล
  5. ตรวจสอบว่ามีการเริ่มต้น mysqld --skip-networking optionโดยไม่ต้อง
  6. เริ่มต้น DB finallyและแก้ไขรหัสของคุณตามที่จะปิดการเชื่อมต่อใน
  7. ปิดการใช้งานไฟร์วอลล์และ / หรือกำหนดค่าไฟร์วอลล์ / พร็อกซีเพื่ออนุญาต / ส่งต่อพอร์ต

ดูสิ่งนี้ด้วย:


4
MAMP / MAMP Pro ตั้งค่า MAMP_skip-networking_MAMP ตามค่าเริ่มต้น คุณต้องปิดการใช้งานบรรทัดนี้ใน my.cfn ของคุณ
Jurik

6
ไม่ใช่ในกรณีนี้ แต่ความล้มเหลวของการเชื่อมต่อการสื่อสารเกิดขึ้นเมื่อคุณใช้กลุ่มการเชื่อมต่อและการเชื่อมต่อถูกปิดเนื่องจากไม่มีการใช้งานเป็นเวลานาน เฉพาะในกรณีนั้นมันบอกว่า "แพ็คเก็ตล่าสุดได้รับ" X "บางวินาทีที่ผ่านมา"
นิกเกล

@nikel ไม่ควรให้เธรดในกลุ่มการเชื่อมต่อนั้นใช้งานได้ด้วยการเริ่มการตรวจสอบความถูกต้อง "เลือก 1" ทำไมพวกเขาถึงถูกปิดลงโดยไม่มีการใช้งานเป็นเวลานานเมื่อเราตั้งค่าให้เครื่องส่งสัญญาณทำงานในช่วงเวลาที่สั้นกว่าเซิร์ฟเวอร์หมดเวลาของ mysql
Farhad

ใช่แบบสอบถามการตรวจสอบจะแก้ไขปัญหานี้ ประเด็นของฉันเกี่ยวกับกรณีที่ไม่มีการตั้งค่า & การเชื่อมต่อในสระว่ายน้ำหมดเวลาเนื่องจากไม่มีการใช้งาน
nikel

บางครั้งพอร์ตหายไปจากสตริงการเชื่อมต่อและไดรเวอร์จะพยายามเชื่อมต่อกับพอร์ตเริ่มต้น 3306 mysql & ล้มเหลวหาก mysql ไม่ทำงานที่พอร์ตนี้ มันเป็นปัญหาของฉันดังนั้นฉันแม้ว่าฉันควรจะพูดถึงในกรณีที่คนอื่นจะพบว่ามีประโยชน์
Abdul Mannan

10

ฉันจับข้อยกเว้นนี้เมื่อ Java ออกจากกอง ถ้าฉันพยายามที่จะใส่ใน RAM รายการข้อมูลจำนวนมาก - ฉันจับครั้งแรก " ความล้มเหลวในการเชื่อมโยงการสื่อสาร " และถัดไป " OutOfMemoryError "

ฉันเข้าสู่ระบบและลดการใช้หน่วยความจำ (ลบข้อมูล 1/2) และตกลงทั้งหมด


9

ในกรณีของฉันฉันต้องเปลี่ยน Localhost เป็นที่อยู่ IP ของเซิร์ฟเวอร์ฐานข้อมูลจริง

แทน

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

ฉันต้องการ

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

ในการอัปเดตล่าสุด 4/5/18: ปัจจุบันฉันใช้ MySQL Workbench 6.3 ฉันมาที่นี่เพื่อตรวจสอบวิธีแก้ปัญหา แต่ฉันพบว่ามันเป็นของตัวเองมันเป็นเพียงว่าเซิร์ฟเวอร์ MySQL ของคุณไม่ทำงานหรือหยุดทำงาน ฉันรีสตาร์ทเซิร์ฟเวอร์ของฉันมันทำงานได้อย่างมีเสน่ห์
Abhishek Ekaanth

7
นี่คือ 'ทางออกที่ดีที่สุด' ทำไม มันแก้ปัญหาอะไรได้อย่างไรและอย่างไร?
มาร์ควิสแห่ง Lorne

วิธีการแก้ปัญหานี้ไม่สามารถสร้าง dataframes
Alan

8

com.mysql.jdbc.exceptions.jdbc4.CommunicationsExceptionข้อยกเว้นนี้เกิดขึ้นหากการเชื่อมต่อฐานข้อมูลของคุณไม่ได้ใช้งานเป็นเวลานาน

การเชื่อมต่อที่ไม่ได้ใช้งานนี้จะส่งกลับค่าความจริงconnection.isClosed();แต่ถ้าเราพยายามที่จะดำเนินการคำสั่งมันจะเริ่มต้นข้อยกเว้นนี้ดังนั้นฉันจะแนะนำให้ไปกับการรวมฐานข้อมูล


2
นอกจากนี้ยังเกิดขึ้นจากสาเหตุอื่นเช่น 'การเชื่อมต่อถูกปฏิเสธ'
มาร์ควิสแห่ง Lorne

6

ฉันมีปัญหาเดียวกันมาหลายชั่วโมงแล้ว ฉันใช้เซิร์ฟเวอร์ MAMP

แทนที่จะใช้ localhost: [Apache Port] ให้ใช้พอร์ต MySQL ของคุณ

ด้านล่างเป็นพอร์ต MySQL เริ่มต้นสำหรับเซิร์ฟเวอร์ MAMP

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);

หากคุณมี mamp ก่อนติดตั้ง Mysql ให้ลองใช้วิธีนี้
DAVIS BENNY 15MIS0426

5

ฉันอาจเห่าต้นไม้ผิดที่นี่ แต่ข้อยกเว้นของคุณดูเหมือนจะระบุว่าเซิร์ฟเวอร์ MySQL ของคุณไม่สามารถใช้ได้

ข้อยกเว้นในเธรด "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: การสื่อสารล้มเหลวในการเชื่อมโยงแพ็คเก็ตล่าสุดที่ส่งไปยังเซิร์ฟเวอร์สำเร็จคือ 0 มิลลิวินาที ไดรเวอร์ไม่ได้รับแพ็กเก็ตจากเซิร์ฟเวอร์ ที่...

จะเกิดอะไรขึ้นถ้าคุณลอง (จากเทอร์มินัล)

mysql -u username -p

คุณจะได้รับแจ้งรหัสผ่านที่เกี่ยวข้องกับชื่อผู้ใช้ หลังจากที่คุณให้รหัสผ่านที่ถูกต้องไคลเอนต์ mysql จะเชื่อมต่อ?

คุณอาจต้องเริ่ม MySQL จากการตั้งค่าถ้าไม่ นอกจากนี้คุณยังสามารถตั้งค่าให้เรียกใช้เมื่อเริ่มต้น


1
ฉันใช้ MAMP เพื่อรันเซิร์ฟเวอร์ MySQL ของฉัน นั่นจะเป็นปัญหาหรือไม่?
Josh K

เมื่อฉันเชื่อมต่อ (ผ่าน Sequal Pro) กับฉันlocalhostฉันใช้ชื่อผู้ใช้ / รหัสผ่านที่ถูกต้องและทำงานได้ดี
Josh K

5

ในกรณีของฉันกลับกลายเป็นว่ารุ่นmysql-connector-javaเก่าเกินไป

ในการสาธิตของฉันฉันใช้mysql-connector-javaอย่างนี้:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

แต่ในสภาพแวดล้อมการพัฒนาฉันใช้สิ่งนี้:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

และรุ่น MySQL ของฉันคือ 5.1.48 (ใช่มันเก่าสำหรับการลอกเลียนแบบผลิตภัณฑ์เท่านั้น) ดังนั้นฉันพบข้อผิดพลาดเดียวกัน

เนื่องจากพบเหตุผลการแก้ปัญหาก็พบเช่นกัน ตรงกับรุ่น!


4
ไม่แน่ ไดรเวอร์รุ่นทั้งหมดเหล่านี้ควรเข้ากันได้แบบย้อนหลัง
มาร์ควิสแห่ง Lorne

1
ดูเหมือนว่าปัญหานี้จะได้รับการแก้ไขในตัวเชื่อมต่อ mysql ใหม่ดูstackoverflow.com/questions/14559794/…
Nishi

กรณีเดียวกันสำหรับฉัน เวอร์ชันของไดรเวอร์สำหรับ MySQL 5 ในขณะที่รุ่นของเซิร์ฟเวอร์คือ 8 ดังนั้นฉันจึงอัปเดตเวอร์ชันของ jar และแก้ไขปัญหาได้
edenPan

4

ฉันได้รับข้อผิดพลาดเดียวกันเพราะฉันพยายามเรียกใช้โปรแกรมของฉันโดยไม่เริ่มเซิร์ฟเวอร์ mysql

หลังจากเริ่มเซิร์ฟเวอร์ mysql ทุกอย่างก็ถูกต้อง


4

คำตอบก่อนหน้านี้มีความเหมาะสม แต่ฉันก็อยากจะชี้ประเด็นที่กว้างกว่านี้

ฉันพบปัญหาที่คล้ายกันและเหตุผลคือข้อ จำกัด ของเครือข่ายของ บริษัท ของฉัน

การเชื่อมต่อแบบเดียวกันก็ประสบความสำเร็จเมื่อฉันอยู่ในเครือข่ายอื่น ๆ


1
ตัวชี้นี้แก้ไขปัญหาของฉันโดยระบุ 'localhost' ทำงานเมื่อฉันเชื่อมต่อกับ VPN แต่ไม่ทำงานหากฉันตัดการเชื่อมต่อจาก VPN แต่ฉันแก้ไขได้โดยเปลี่ยน 'localhost' เป็น '127.0.0.1'
gannu_lee

4

โปรดอัปเดตที่อยู่ IP ของคุณในไฟล์ /etc/mysql/my.cnf

bind-address  = 0.0.0.0

เริ่มบริการ mysql deamon และ mysql ใหม่


1
แก้ไขเพื่อใช้ที่อยู่ผูกที่ถูกต้อง
OneCricketeer

3

ดาวน์โหลด MySQL-JDBC-Type-4-Treiber (ig 'mysql-connector-java-5.1.11-bin.jar' จาก 'mysql-connector-java-5.1.11.zip') ที่Mysql Mysql

คุณต้อง inculde jar ของไดรเวอร์ในระหว่างการคอมไพล์และรันไทม์ใน classpath ของคุณ

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );

ไม่เลยทำให้ฉันมีข้อผิดพลาดเกี่ยวกับการไม่พบสิ่งใดเลย เป็นไปได้ไหมที่จะนำเข้าสิ่งนี้โดยไม่มีไฟล์ JAR
Josh K

@ Josh สิ่งนี้ใช้งานได้จริงคุณเพียงแค่ต้องตั้งค่า classpath ของคุณอย่างถูกต้อง (หรือคัดลอก jar ลงในไดเรกทอรี% JAVA_HOME% \ jre \ lib \ ext ของคุณ แต่นี่ถือว่าเป็นวิธีปฏิบัติที่ไม่ดี)
stacker

3

ข้อผิดพลาดนี้อาจเกิดขึ้นหาก Java พยายามเชื่อมต่อกับ MySQL ผ่าน SSL แต่มีบางอย่างผิดปกติ (ในกรณีของฉันฉันกำหนดค่าพูลการเชื่อมต่อ Payara Server 5.193.1 เป็น MySQL)

useSSL=falseบางคนแนะนำการตั้งค่า อย่างไรก็ตามเนื่องจากเวอร์ชันตัวเชื่อมต่อ / J 8.0.13การตั้งค่านั้นเลิกใช้แล้ว นี่คือข้อความที่ตัดตอนมาจากคุณสมบัติการกำหนดค่า MySQL Connector / J 8.0 :

sslMode

โดยค่าเริ่มต้นการเชื่อมต่อเครือข่ายจะถูกเข้ารหัส SSL; คุณสมบัตินี้อนุญาตให้ปิดการเชื่อมต่อที่ปลอดภัยหรือเลือกระดับความปลอดภัยอื่น อนุญาตให้ใช้ค่าต่อไปนี้: DISABLED- สร้างการเชื่อมต่อที่ไม่เข้ารหัส PREFERRED- (ค่าเริ่มต้น) สร้างการเชื่อมต่อที่เข้ารหัสหากเซิร์ฟเวอร์เปิดใช้งานมิฉะนั้นถอยกลับไปยังการเชื่อมต่อที่ไม่ได้เข้ารหัส REQUIRED- สร้างการเชื่อมต่อที่ปลอดภัยหากเซิร์ฟเวอร์เปิดใช้งานไม่สำเร็จ; VERIFY_CA- ชอบREQUIREDแต่เพิ่มเติมการตรวจสอบใบรับรอง TLS ของเซิร์ฟเวอร์กับใบรับรอง Certificate Authority (CA) ที่กำหนดค่าไว้ VERIFY_IDENTITY- ชอบVERIFY_CAแต่ให้ตรวจสอบเพิ่มเติมว่าใบรับรองเซิร์ฟเวอร์ตรงกับโฮสต์ที่พยายามเชื่อมต่อ

สถานที่แห่งนี้ถูกแทนที่ด้วยคุณสมบัติที่เลิกมรดกuseSSL, requireSSLและverifyServerCertificateซึ่งได้รับการยอมรับยังคง แต่แปลเป็นค่าสำหรับsslModeถ้าsslModeไม่ได้กำหนดอย่างชัดเจน: useSSL=falseแปลไปsslMode=DISABLED; {"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"}แปลเป็นsslMode=PREFERRED;{"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"}แปลเป็นsslMode=REQUIRED; จะแปลให้{"useSSL=true" AND "verifyServerCertificate=true"} ไม่มีการตั้งค่ามรดกเทียบเท่าเป็นsslMode=VERIFY_CA sslMode=VERIFY_IDENTITYทราบว่าสำหรับทุกรุ่นเซิร์ฟเวอร์ตั้งค่าเริ่มต้นของการsslModeเป็นPREFERREDและมันจะเทียบเท่ากับการตั้งค่ามรดกของuseSSL=true, ซึ่งมีความแตกต่างจากการตั้งค่าเริ่มต้นของพวกเขาสำหรับการเชื่อมต่อ / J 8.0.12 และก่อนหน้านี้ในบางสถานการณ์ แอปพลิเคชันที่ใช้คุณสมบัติดั้งเดิมต่อไปและควรตรวจสอบการตั้งค่าเริ่มต้นเดิมrequireSSL=falseและverifyServerCertificate=false

คุณสมบัติดั้งเดิมจะถูกละเว้นหาก sslModeมีการตั้งค่าไว้อย่างชัดเจน หากไม่มีการตั้งค่าใด ๆsslModeหรือuseSSLชัดเจนการตั้งค่าเริ่มต้นของsslMode=PREFERREDใช้

ค่าเริ่มต้น :PREFERRED

ตั้งแต่เวอร์ชัน : 8.0.13

ดังนั้นในกรณีของฉันการตั้งค่า sslMode=DISABLEDคือทั้งหมดที่ฉันต้องการเพื่อแก้ไขปัญหา นี่เป็นเครื่องทดสอบ แต่สำหรับการผลิตโซลูชันที่ปลอดภัยจะทำการกำหนดค่าไคลเอนต์ Java และเซิร์ฟเวอร์ MySQL ให้ใช้ SSL อย่างถูกต้อง


ขอให้สังเกตว่าโดยการปิดใช้ SSL allowPublicKeyRetrieval=trueคุณยังอาจจะต้องตั้งค่า (อีกครั้งไม่ใช่การตัดสินใจที่ชาญฉลาดจากมุมมองด้านความปลอดภัย) ข้อมูลเพิ่มเติมให้ไว้ใน MySQL ConnectionString Options :

AllowPublicKeyRetrieval

หากบัญชีผู้ใช้ใช้การsha256_passwordพิสูจน์ตัวตนรหัสผ่านจะต้องได้รับการปกป้องในระหว่างการส่ง TLS เป็นกลไกที่ต้องการสำหรับสิ่งนี้ แต่ถ้ามันไม่พร้อมใช้งานการเข้ารหัสคีย์สาธารณะ RSA จะถูกนำมาใช้ ในการระบุคีย์สาธารณะของเซิร์ฟเวอร์ RSA ให้ใช้การServerRSAPublicKeyFileตั้งค่าสตริงการเชื่อมต่อหรือตั้งค่าAllowPublicKeyRetrieval=Trueเพื่ออนุญาตให้ไคลเอนต์ร้องขอรหัสสาธารณะจากเซิร์ฟเวอร์โดยอัตโนมัติ โปรดทราบว่าAllowPublicKeyRetrieval=Trueอาจอนุญาตให้พร็อกซีประสงค์ร้ายทำการโจมตี MITM เพื่อรับรหัสผ่าน plaintext ดังนั้นจึงเป็นเท็จโดยค่าเริ่มต้นและต้องเปิดใช้งานอย่างชัดเจน


หัวข้อที่เกี่ยวข้องจากปลาสคอมบิรอยด์เซิร์ฟเวอร์ GitHub
MS Dousti

3

ปัญหาเดียวกันของฉันได้รับการแก้ไขโดยขั้นตอนต่อไปนี้:

  1. ไปที่ my.cnf

    vi /etc/mysql/my.cnf
  2. แก้ไข bind-address

    "bind-address = 0.0.0.0"
  3. รีสตาร์ท MySQL

    sudo /etc/init.d/mysql restart

2

หากคุณใช้WAMPหรือXAMPเซิร์ฟเวอร์เพื่อติดตั้งฐานข้อมูล mysql จากนั้นคุณต้องเริ่มต้น mysql ตัดอย่างชาญฉลาดอื่น ๆ มันจะแสดง com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureในขณะที่เชื่อมต่อกับฐานข้อมูล


2

ฉันแก้ไขปัญหานี้ด้วยวิธีง่ายๆซึ่งทำงานได้สำหรับฉัน ฉันมีปัญหา seme "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: การเชื่อมโยงล้มเหลวในการสื่อสาร" ในไฟล์ db.properties ของฉันฉันมีสิ่งนี้: url: jdbc: mysql: // localhost: 90 / myDB เพียงลบ url พอร์ตออกเท่านั้นทำให้เกิดลักษณะนี้ url: jdbc: mysql: // localhost / myDB และที่ทำงานให้ฉัน .


2

เกิดอะไรขึ้นกับฉันเมื่อฉันเปลี่ยนพอร์ต mysql จาก 3306 เป็น 3307 ใน my.ini และไฟล์ php.ini แต่หลังจากเปลี่ยนพอร์ต (3307-> 3306) กลับใช้งานได้อีกครั้ง


2

หากคุณเปลี่ยนพอร์ตของคุณคุณจะได้รับข้อผิดพลาด "com.mysql.jdbc.exceptions.jdbc4.CommunicationException: การเชื่อมโยงการสื่อสารล้มเหลว" โปรดตรวจสอบหมายเลขพอร์ตของคุณ


1

เพิ่งพบสิ่งนี้

ต้องทำให้มันทำงานโดย: (สามารถวางไว้ใน intializer บล็อกคงที่)

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

ยังได้รับการเชื่อมต่อผ่าน:

conn = DriverManager.getConnection(DBURL,<username>,<password>);

แทนที่จะระบุพารามิเตอร์การเข้าสู่ระบบ

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

ความนับถือ.


2
บล็อกแบบคงที่ไม่จำเป็นตั้งแต่ 2550 และคุณสามารถระบุพารามิเตอร์การเข้าสู่ระบบด้วยวิธีใดวิธีหนึ่ง
มาร์ควิสแห่ง Lorne

1

พยายามที่จะเปลี่ยนไปlocalhost127.0.0.1

localhost ::1จะมีมติให้ และ MySQL ไม่สามารถเชื่อมต่อผ่าน IPv6 ได้ตามค่าเริ่มต้น

และนี่คือผลลัพธ์ของtelnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

และไม่มีการตอบสนองจากเซิร์ฟเวอร์ MySQL

แน่นอนโปรดตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ MySQL ของคุณทำงานอยู่


ที่จริงแล้วเป็นปัญหากับไฟล์ / etc / hosts ของคุณไม่ใช่ Mysql
OneCricketeer

@ cricket_007 โดยค่าเริ่มต้น localhost จะได้รับการแก้ไขเป็น :: 1 แทน 127.0.0.1
Haozhe Xie

1
แน่นอนว่าหากเปิดใช้งาน ipv6 และขึ้นอยู่กับไฟล์โฮสต์
OneCricketeer

1
dbhost=jdbc:mysql://172.18.23.100:3306/yourdatabase?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
user=root
password=Password#321

con = DriverManager.getConnection(dbhost, user, password);

ถ้า mysql เวอร์ชั่น 8 หรือสูงกว่าผู้ใช้ปรับปรุงการเชื่อมต่อ


นี่คือคำตอบที่ถูกต้องเพียงแค่เพิ่ม useSSL = false เข้ากับสตริงการเชื่อมต่อเมื่อใช้ไดรเวอร์ MySQL 8 ขึ้นไป
Mohannd

1

สำหรับการโทรระยะไกลสู่ Mysql

  1. เพิ่มผู้ใช้ระยะไกลไปยังMysqlจากสำหรับ exemple IP = remoteIP:

    mysql -u xxxx -p //local coonection to mysql
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
    //Query OK, 0 rows affected (xx sec)
    mysql> FLUSH PRIVILEGES;
    //Query OK, 0 rows affected
  2. อนุญาตการเข้าถึงจากระยะไกลสู่ Mysql (โดยค่าเริ่มต้นการโทรภายนอกทั้งหมดไม่ได้รับอนุญาต):

    Edit 
    /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
    Change line:  bind-address = 127.0.0.1   to
                  bind-address = 0.0.0.0
    Restart Mysql: /etc/init.d/mysql restart
  3. สำหรับไดร์เวอร์ JDBC เวอร์ชั่นล่าสุด JDBC:

    jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
    jdbc.user='theNewUser'

0

ฉันมีปัญหาเดียวกันและนี่คือวิธีการแก้ไข:

  1. . jsp ของฉันกำลังเรียกคุณสมบัติที่ฉันยังไม่ได้กำหนดใน servlet
  2. ฉันมีชื่อคอลัมน์สองชื่อที่ฉันส่งผ่านวัตถุผ่านResultSet (getString("columnName"))ที่ไม่ตรงกับชื่อคอลัมน์ในฐานข้อมูลของฉัน

ฉันไม่แน่ใจว่าอันไหนแก้ปัญหาได้ แต่มันใช้งานได้ นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณได้สร้างแบบสอบถามใหม่StatementและResultSetสำหรับแต่ละตารางแบบสอบถาม


1
(1) ไม่ทำให้เกิดปัญหานี้อย่างแน่นอน
มาร์ควิสแห่ง Lorne

0

มันอาจเป็นปัญหาไหอย่างง่าย อาจเป็นเพราะคุณกำลังใช้mysql-connector-java-XXX-bin.jarเวอร์ชั่นเก่าซึ่งไม่รองรับเวอร์ชัน mysql ปัจจุบันของคุณ ฉันใช้ mysql-connector-java-5.1.18-bin.jarตามที่ฉันใช้mysql 5.5และปัญหานี้ได้รับการแก้ไขสำหรับฉัน


1
ใช่อาจมีโอกาสเกิดอาการไหที่ไม่ตรงกัน
Kiran Nunna

ไดรเวอร์รุ่นเหล่านี้ทั้งหมดควรเข้ากันได้
มาร์ควิสแห่ง Lorne

0

บางทีคุณอาจไม่ได้เริ่ม Mysql และ Apache Server ของคุณ หลังจากที่ฉันเริ่มต้นเซิร์ฟเวอร์ Apache และ Mysql จากแผงควบคุม XAMPP การเชื่อมต่อสำเร็จแล้ว

โชคดี!


0

สิ่งที่แก้ไขได้สำหรับฉันคือการทำ 2 สิ่ง: 1. สร้างผู้ใช้ใหม่นอกเหนือจากรูทด้วยรหัสผ่านบางส่วนโดยใช้ connads ต่อไปนี้:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. แสดงความคิดเห็นบรรทัดที่อยู่ IP บน mysqld.conf

จากนั้นเชื่อมต่อกับชื่อผู้ใช้และรหัสผ่านใหม่ มันควรจะทำงาน


คุณจะต้องทำซ้ำสำหรับผู้ใช้ระยะไกลทั้งหมดหรือเพิ่ม wildcard แทน Localhost
OneCricketeer

0

พยายามเชื่อมต่อกับ MySQL รุ่นเก่ากว่า ('version', '5.1.73'); เมื่อคุณใช้ไดรเวอร์รุ่นใหม่กว่าคุณจะได้รับข้อผิดพลาดที่บอกให้คุณใช้"com.mysql.cj.jdbc.Driverหรือแม้แต่ว่าคุณไม่จำเป็นต้องระบุว่าคุณใช้รุ่นใด

กำลังโหลดคลาสcom.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver ' คนขับรถจะลงทะเบียนโดยอัตโนมัติผ่าน SPI และการโหลดคลาสคนขับโดยอัตโนมัตินั้นไม่จำเป็น

ผมเปลี่ยนการประกาศใช้ 5.1.38 รุ่นของ MySQL ขั้วต่อ-Java และในรหัสที่ฉันเก็บไว้com.mysql.jdbc.Driver

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

ทุกอย่างเริ่มต้นเมื่อฉันเห็นคำตอบของ Ankit Jain


0

ไฟร์วอลล์ของฉันปิดกั้นโพสต์ 3307 ซึ่ง MySQL ของฉันฟังอยู่ ดังนั้นฉันเปลี่ยนพอร์ตจาก 3307 เป็น 3306 จากนั้นฉันสามารถเชื่อมต่อกับฐานข้อมูลได้สำเร็จ


0

ใน MacBook ของฉันฉันได้แก้ไขข้อผิดพลาดนี้เฉพาะเมื่อติดตั้ง eclipse EE เวอร์ชันใหม่และลบเซิร์ฟเวอร์ภายในเช่น xamp mysql หรือ mamp แต่ใช้เพียงหนึ่งในนั้น ...


0

ในกรณีของฉันฉันต้องสร้าง ssh tunnel ไปยังฐานข้อมูลระยะไกลและการตั้งค่าทั้งหมดนั้นถูกต้องและการทดสอบการเชื่อมต่อกับ PhpStorm ก็ประสบความสำเร็จเช่นกัน และสคีมาก็ถูกโหลดด้วย แต่ไม่ใช่ข้อมูล แต่ฉันได้รับ:

[08S01] 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.

ไม่ได้ทำงานกับคำแนะนำข้างต้น ด้วยเหตุผลใดก็ตามฉันพยายามที่จะแก้ปัญหาโดยเพียงแค่รีสตาร์ท PhpStorm และ voila มันทำงานได้!


0

ฉันได้รับข้อผิดพลาดหลายอย่างเช่น:

  • CommunicationsException: Communications link failure
  • java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Connection.createStatement()' on a null object reference at.

ฉันต้องเพิ่ม:

  • ใน AndroidManifest.xml รวม<uses-permission android:name="android.permission.INTERNET"/>อยู่หลังแท็กเปิด

  • เพิ่มไดรเวอร์ JDBC ในการอ้างอิง Gradle (หรือ Maven) ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.