com.mysql.jdbc.exceptions.jdbc4. Truyền thông Ngoại lệ: Lỗi liên kết truyền thông


225

Tôi đang làm việc để có được cơ sở dữ liệu của mình để nói chuyện với các chương trình Java của tôi.

Ai đó có thể cho tôi một chương trình mẫu nhanh và bẩn bằng cách sử dụng JDBC không?

Tôi đang nhận được một lỗi khá lớn:

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

Nội dung của tệp thử nghiệm:

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
Tôi là một kẻ ngu ngốc. Máy chủ MySQL chưa được khởi động :( Nó đã thành công sau khi khởi động nó.
akfaisel

Câu trả lời:


251

Vì vậy, bạn có một

com.mysql.jdbc.exceptions.jdbc4. Truyền thông ngoại lệ: Lỗi liên kết truyền thông
java.net.ConnectException: Kết nối bị từ chối

Tôi đang trích dẫn từ câu trả lời này cũng chứa hướng dẫn từng bước của MySQL + JDBC:

Nếu bạn nhận được một SQLException: Connection refusedhoặc Connection timed outmột MySQL cụ thể CommunicationsException: Communications link failure, thì điều đó có nghĩa là DB hoàn toàn không thể truy cập được. Điều này có thể có một hoặc nhiều nguyên nhân sau:

  1. Địa chỉ IP hoặc tên máy chủ trong URL JDBC là sai.
  2. Tên máy chủ trong URL JDBC không được máy chủ DNS cục bộ nhận ra.
  3. Số cổng bị thiếu hoặc sai trong URL JDBC.
  4. Máy chủ DB ngừng hoạt động.
  5. Máy chủ DB không chấp nhận kết nối TCP / IP.
  6. Máy chủ DB đã hết kết nối.
  7. Một cái gì đó ở giữa Java và DB đang chặn các kết nối, ví dụ như tường lửa hoặc proxy.

Để giải quyết cái này hay cái khác, hãy làm theo các lời khuyên sau:

  1. Xác minh và kiểm tra chúng với ping.
  2. Làm mới DNS hoặc sử dụng địa chỉ IP trong URL JDBC thay thế.
  3. Xác minh nó dựa trên my.cnfMySQL DB.
  4. Bắt đầu DB.
  5. Xác minh nếu mysqld được bắt đầu mà không có --skip-networking option.
  6. Khởi động lại DB và sửa mã của bạn cho phù hợp để nó đóng các kết nối finally.
  7. Vô hiệu hóa tường lửa và / hoặc cấu hình tường lửa / proxy để cho phép / chuyển tiếp cổng.

Xem thêm:


4
MAMP / MAMP Pro đặt MAMP_skip -etwork_MAMP theo mặc định. Bạn đã vô hiệu hóa dòng này trong my.cfn của bạn
Jurik

6
Không phải trong trường hợp này, nhưng Lỗi liên kết truyền thông cũng xảy ra khi bạn đang sử dụng nhóm kết nối và các kết nối bị đóng do không hoạt động kéo dài. Chỉ trong trường hợp đó, nó nói "Gói cuối cùng đã nhận được một số" X "giây trước"
nikel

@nikel Không nên duy trì các luồng trong nhóm kết nối bằng cách kích hoạt truy vấn xác thực "chọn 1"? Tại sao họ sẽ bị đóng cửa do không hoạt động kéo dài khi chúng tôi đã thiết lập trình trục xuất chạy trong khoảng thời gian ngắn hơn thời gian chờ máy chủ mysql?
Farhad

Có, một truy vấn xác nhận sẽ khắc phục điều này. Quan điểm của tôi là về trường hợp khi nó không được đặt và các kết nối trong nhóm bị hết thời gian do không hoạt động
nikel

Đôi khi cổng bị thiếu trong chuỗi kết nối và trình điều khiển sẽ cố gắng kết nối với cổng mys6 3306 mặc định và không thành công nếu mysql không chạy ở cổng này. Đó là vấn đề của tôi vì vậy tôi mặc dù tôi nên đề cập đến trong trường hợp người khác sẽ thấy nó hữu ích.
Abdul Man Nam

10

Tôi bắt ngoại lệ này khi Java hết đống. Nếu tôi cố gắng đặt vào RAM nhiều mục dữ liệu - đầu tiên tôi bắt gặp " Lỗi liên kết truyền thông " và tiếp theo là " OutOfMemoryError ".

Tôi đã đăng nhập nó và tôi giảm mức tiêu thụ bộ nhớ (xóa 1/2 dữ liệu) và tất cả đều ổn.


9

Trong trường hợp của tôi, tôi cần thay thế Localhost thành địa chỉ IP của máy chủ cơ sở dữ liệu thực tế

Thay vì

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

tôi cần

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

Trên Bản cập nhật mới nhất 4/5/18: Hiện tại, tôi đang sử dụng MySQL Workbench 6.3. Tôi đến đây để kiểm tra giải pháp nhưng tôi tự tìm thấy giải pháp, chỉ là máy chủ MySQL của bạn không chạy hoặc bị dừng. Tôi khởi động lại máy chủ của mình, nó hoạt động như một cơ duyên.
Abhishek Ekaanth

7
Đây là "giải pháp tốt nhất" tại sao? Vấn đề gì nó giải quyết, và làm thế nào?
Hầu tước Lorne

giải pháp này không thể tạo dataframes
Alan

8

com.mysql.jdbc.exceptions.jdbc4.CommunicationsExceptionNgoại lệ này xảy ra nếu kết nối cơ sở dữ liệu của bạn không hoạt động trong thời gian dài.

Kết nối nhàn rỗi này trả về true connection.isClosed();nhưng nếu chúng ta cố gắng thực thi câu lệnh thì nó sẽ kích hoạt ngoại lệ này vì vậy tôi sẽ đề nghị đi cùng với cơ sở dữ liệu.


2
Nó cũng xảy ra vì những lý do khác như 'kết nối bị từ chối'.
Hầu tước Lorne

6

Tôi đã có cùng một vấn đề trong nhiều giờ. Tôi đang sử dụng máy chủ MAMP

Thay vì sử dụng localhost: [Cổng Apache], hãy sử dụng cổng MySQL của bạn.

Dưới đây là Cổng MySQL mặc định cho máy chủ MAMP.

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

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

nếu bạn có mamp trước khi cài đặt Mysql thì hãy thử phương pháp này
DAVIS BENNY 15MIS0426 20/07/18

5

Tôi có thể đang sủa sai cây ở đây, nhưng ngoại lệ của bạn dường như cho thấy máy chủ MySQL của bạn không khả dụng.

Ngoại lệ trong luồng "chính" com.mysql.jdbc.exceptions.jdbc4. Truyền thông Ngoại lệ: Lỗi liên kết truyền thông Gói cuối cùng được gửi thành công đến máy chủ là 0 mili giây trước. Trình điều khiển đã không nhận được bất kỳ gói từ máy chủ. tại ...

Điều gì xảy ra nếu bạn thử (từ thiết bị đầu cuối)

mysql -u username -p

Bạn sẽ được nhắc nhập mật khẩu liên quan đến tên người dùng. Sau khi bạn cung cấp mật khẩu chính xác, máy khách mysql có kết nối không?

Bạn có thể phải khởi động MySQL từ Tùy chọn nếu không. Bạn cũng có thể thiết lập nó để chạy khi khởi động.


1
Tôi đang sử dụng MAMP để chạy máy chủ MySQL của mình. Đó sẽ là một vấn đề?
Josh K

Khi tôi kết nối (thông qua Sequal Pro) với tôi, localhosttôi sử dụng đúng tên người dùng / mật khẩu và nó hoạt động tốt.
Josh K

5

Trong trường hợp của tôi, hóa ra là phiên bản mysql-connector-javaquá cũ.

Trong bản demo của tôi, bằng cách nào đó tôi sử dụng mysql-connector-javanhư thế này:

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

Nhưng trong môi trường phát triển, tôi sử dụng điều này:

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

Và phiên bản MySQL của tôi là 5.1.48 (vâng, nó đã cũ, chỉ để bắt chước phiên bản sản phẩm). Vì vậy, tôi đã gặp lỗi tương tự.

Vì lý do được tìm thấy, giải pháp cũng được tìm thấy. Phù hợp với phiên bản!


4
Không có khả năng. Tất cả các phiên bản trình điều khiển này được cho là tương thích ngược.
Hầu tước Lorne

1
Vấn đề này dường như đã được khắc phục trong các trình kết nối mysql mới, xem stackoverflow.com/questions/14559794/ mẹo
Nishi

Trường hợp tương tự đối với tôi. Phiên bản của trình điều khiển là dành cho MySQL 5 trong khi phiên bản của máy chủ là 8. Vì vậy, tôi đã cập nhật phiên bản của jar và vấn đề đã được giải quyết.
edenPan

4

Tôi đã gặp lỗi tương tự vì tôi đã cố chạy chương trình của mình mà không khởi động máy chủ mysql.

Sau khi khởi động máy chủ mysql, mọi thứ đều ổn.


4

Câu trả lời trước đó là thích hợp. Nhưng, tôi cũng muốn chỉ ra một vấn đề chung chung hơn.

Tôi đã đối mặt với vấn đề tương tự và lý do là một hạn chế mạng của công ty tôi.

Kết nối tương tự đã thành công khi tôi ở bất kỳ mạng nào khác.


1
Con trỏ này đã giải quyết vấn đề của tôi, chỉ định 'localhost' đã hoạt động khi tôi kết nối với VPN, nhưng tương tự không hoạt động nếu tôi ngắt kết nối với VPN, tuy nhiên tôi đã sửa lỗi này bằng cách thay đổi 'localhost' thành '127.0.0.1'
gannu_lee

4

Vui lòng cập nhật địa chỉ IP của bạn trong tệp /etc/mysql/my.cnf

bind-address  = 0.0.0.0

Khởi động lại dịch vụ myseam deamon và mysql.


1
Đã chỉnh sửa để sử dụng địa chỉ liên kết hợp lệ
OneCricketeer

3

Tải xuống MySQL-JDBC-Type-4-Treiber (ig 'mysql-Connector-java-5.1.11-bin.jar' từ 'mysql-connector-java-5.1.11.zip') tại Mysql .

Bạn cần phải đưa vào trình điều khiển jar trong quá trình biên dịch- và thời gian chạy trong đường dẫn lớp của bạn.

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" );

Không, cho tôi một cơn bão lỗi về việc không tìm thấy bất cứ điều gì. Có thể nhập cái này mà không có tệp JAR không?
Josh K

@Josh này hoạt động, bạn thực sự chỉ cần thiết lập đường dẫn lớp của bạn đúng cách. (Hoặc sao chép jar vào thư mục% JAVA_HOME% \ jre \ lib \ ext của bạn, nhưng điều này được coi là thực hành xấu)
stacker

3

Lỗi này cũng có thể xảy ra nếu Java cố gắng kết nối với MySQL qua SSL, nhưng đã xảy ra lỗi. (Trong trường hợp của tôi, tôi đã định cấu hình nhóm kết nối Payara Server 5.193.1 thành MySQL.)

Một số người đề nghị thiết lập useSSL=false. Tuy nhiên, vì phiên bản Connector / J 8.0.13, cài đặt đó không được chấp nhận. Đây là một đoạn trích từ Thuộc tính cấu hình MySQL Connector / J 8.0 :

sslMode

Theo mặc định, các kết nối mạng được mã hóa SSL; thuộc tính này cho phép các kết nối an toàn bị tắt hoặc một mức bảo mật khác được chọn. Các giá trị sau được cho phép: DISABLED- Thiết lập các kết nối không được mã hóa; PREFERRED- (mặc định) Thiết lập các kết nối được mã hóa nếu máy chủ kích hoạt chúng, nếu không thì quay lại các kết nối không được mã hóa; REQUIRED- Thiết lập kết nối an toàn nếu máy chủ kích hoạt chúng, không thành công; VERIFY_CA- Thích REQUIREDnhưng xác minh thêm chứng chỉ TLS của máy chủ đối với chứng chỉ Tổ chức phát hành chứng chỉ (CA) được cấu hình; VERIFY_IDENTITY- GiốngVERIFY_CA , nhưng xác minh thêm rằng chứng chỉ máy chủ phù hợp với máy chủ mà kết nối được thử.

Khách sạn này thay thế các thuộc tính NỮA di sản useSSL, requireSSLverifyServerCertificate, mà vẫn được chấp nhận nhưng dịch sang một giá trị cho sslModenếu sslModekhông được thiết lập một cách rõ ràng: useSSL=falseđược phiên dịch sang sslMode=DISABLED; {"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"}được dịch sang sslMode=PREFERRED; {"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"}được dịch sang sslMode=REQUIRED; {"useSSL=true" AND "verifyServerCertificate=true"}được dịch sang sslMode=VERIFY_CA. Không có cài đặt di sản tương đương cho sslMode=VERIFY_IDENTITY. Lưu ý rằng, đối với các phiên bản máy chủ ALL, các thiết lập mặc định của sslModePREFERRED, và nó tương đương với các cài đặt cũ của useSSL=true, requireSSL=falseverifyServerCertificate=false, khác với cài đặt mặc định của chúng cho Trình kết nối / J 8.0.12 trở về trước trong một số trường hợp. Các ứng dụng tiếp tục sử dụng các thuộc tính cũ và dựa trên các cài đặt mặc định cũ của chúng nên được xem xét.

Các thuộc tính kế thừa được bỏ qua nếu sslModeđược đặt rõ ràng. Nếu không có sslModehoặc useSSLđược đặt rõ ràng, cài đặt mặc định sslMode=PREFERREDsẽ được áp dụng.

Mặc định :PREFERRED

Kể từ phiên bản : 8.0.13

Vì vậy, trong trường hợp của tôi, cài đặt sslMode=DISABLEDlà tất cả những gì tôi cần để giải quyết vấn đề. Đây là trên một máy thử nghiệm. Nhưng để sản xuất, giải pháp bảo mật sẽ được cấu hình đúng máy khách Java và máy chủ MySQL để sử dụng SSL.


Lưu ý rằng bằng cách vô hiệu hóa SSL, bạn cũng có thể phải thiết lập allowPublicKeyRetrieval=true. (Một lần nữa, không phải là một quyết định khôn ngoan từ quan điểm bảo mật). Thông tin thêm được cung cấp trong Tùy chọn kết nối MySQL :

AllowPublicKeyRetriny

Nếu tài khoản người dùng sử dụng sha256_passwordxác thực, mật khẩu phải được bảo vệ trong quá trình truyền; TLS là cơ chế ưa thích cho việc này, nhưng nếu nó không khả dụng thì mã hóa khóa công khai RSA sẽ được sử dụng. Để chỉ định khóa chung RSA của máy chủ, hãy sử dụng ServerRSAPublicKeyFilecài đặt chuỗi kết nối hoặc được đặt AllowPublicKeyRetrieval=Trueđể cho phép máy khách tự động yêu cầu khóa chung từ máy chủ. Lưu ý rằng AllowPublicKeyRetrieval=Truecó thể cho phép một proxy độc hại thực hiện một cuộc tấn công MITM để lấy mật khẩu văn bản gốc, do đó, nó là Sai theo mặc định và phải được kích hoạt rõ ràng.


Chủ đề liên quan từ Payara Server GitHub .
MS Dousti

3

Vấn đề tương tự của tôi được giải quyết bằng các bước sau:

  1. Đi đến my.cnf

    vi /etc/mysql/my.cnf
  2. Sửa đổi địa chỉ liên kết của nó

    "bind-address = 0.0.0.0"
  3. Khởi động lại MySQL

    sudo /etc/init.d/mysql restart

2

Nếu bạn đang sử dụng WAMPhoặc XAMPmáy chủ để cài đặt cơ sở dữ liệu mysql. Sau đó, bạn phải khởi động một cách rõ ràng mysql sever khác nó sẽ hiển thị com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failuretrong khi kết nối với cơ sở dữ liệu


2

tôi đã giải quyết vấn đề này một cách dễ dàng, điều đó hiệu quả với tôi. tôi đã gặp vấn đề seme "com.mysql.jdbc.exceptions.jdbc4. Truyền thông ngoại lệ: Lỗi liên kết truyền thông". Trong tệp db.properIES của tôi, tôi đã có: url: jdbc: mysql: // localhost: 90 / myDB, chỉ xóa url cổng, dẫn đến cách này url: jdbc: mysql: // localhost / myDB và nó hoạt động với tôi .


2

Điều đó đã xảy ra với tôi khi tôi thay đổi cổng mysql từ 3306 thành 3307 trong các tệp my.ini và php.ini nhưng sau khi thay đổi các cổng (3307-> 3306) thì nó hoạt động tốt trở lại.


2

Nếu bạn đã thay đổi cổng của mình, bạn sẽ gặp loại lỗi này "com.mysql.jdbc.exceptions.jdbc4. Truyền thông Ngoại lệ: Lỗi liên kết truyền thông" Vui lòng kiểm tra số cổng của bạn


1

Chỉ cần trải nghiệm điều này.

Phải làm cho nó hoạt động bằng cách: (cái này có thể được đặt trong intializer khối tĩnh)

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

Cũng bằng cách có được kết nối thông qua:

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

thay vì chỉ định các tham số đăng nhập

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

Trân trọng.


2
Khối tĩnh không cần thiết kể từ năm 2007 và bạn có thể chỉ định các tham số đăng nhập theo bất kỳ cách nào.
Hầu tước Lorne

1

Hãy cố gắng thay đổi localhostđể 127.0.0.1.

Localhost sẽ được giải quyết ::1. Và MySQL không thể được kết nối qua IPv6 theo mặc định.

Và đây là đầu ra của telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

Và không có phản hồi từ máy chủ MySQL.

Tất nhiên, hãy chắc chắn rằng máy chủ MySQL của bạn đang chạy.


Đó thực sự là một vấn đề với tệp / etc / hosts của bạn, không phải Mysql
OneCricketeer

@ cricket_007 Theo mặc định, localhost được phân giải thành :: 1 thay vì 127.0.0.1.
Haozhe Xie

1
Chắc chắn, chỉ khi ipv6 được bật và tùy thuộc vào tệp máy chủ
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);

Nếu mysql phiên bản 8 hoặc cao hơn kết nối người dùng cập nhật


Đây là câu trả lời đúng chỉ cần thêm useSSL = false vào chuỗi kết nối khi sử dụng trình điều khiển MySQL 8 trở lên.
Mohannd

1

Đối với cuộc gọi từ xa đến Mysql

  1. Thêm người dùng từ xa vào Mysql từ ví dụ 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. Cho phép truy cập từ xa vào Mysql (theo mặc định tất cả các cuộc gọi externall không được phép):

    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. Đối với Phiên bản mới nhất của Trình điều khiển 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

Tôi đã có cùng một vấn đề, và đây là cách khắc phục:

  1. .Jsp của tôi đã gọi các thuộc tính mà tôi chưa xác định trong servlet.
  2. Tôi có hai tên cột mà tôi đang truyền vào một đối tượng ResultSet (getString("columnName"))mà không khớp với tên cột trong cơ sở dữ liệu của tôi.

Tôi không chắc chắn cái nào đã khắc phục vấn đề, nhưng nó đã hoạt động. Ngoài ra, hãy chắc chắn rằng bạn tạo một truy vấn mới StatementResultSetcho mỗi truy vấn bảng.


1
(1) chắc chắn không gây ra vấn đề này.
Hầu tước Lorne

0

Nó có thể là một vấn đề jar đơn giản. có thể bạn đang sử dụng một cái cũ mysql-connector-java-XXX-bin.jarkhông được hỗ trợ bởi phiên bản mysql hiện tại của bạn. tôi đã sử dụng mysql-connector-java-5.1.18-bin.jarnhư tôi đang sử dụng mysql 5.5và vấn đề này được giải quyết cho tôi.


1
Có có thể có cơ hội không phù hợp jar.
Kiran Nunna 17/05/2015

Tất cả các phiên bản trình điều khiển này được cho là tương thích.
Hầu tước Lorne

0

Có lẽ bạn đã không khởi động Mysql và Apache Server của mình. Sau khi tôi khởi động máy chủ Apache và Mysql từ Bảng điều khiển XAMPP, kết nối đã được thiết lập thành công.

Chúc may mắn!


0

Điều đã giải quyết cho tôi là làm 2 việc: 1. tạo người dùng mới ngoài root bằng một số mật khẩu bằng cách sử dụng các liên kết sau:

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

2. nhận xét dòng địa chỉ IP trên mysqld.conf

sau đó kết nối với tên người dùng và mật khẩu mới. nó nên hoạt động


Bạn sẽ cần phải lặp lại điều đó đối với tất cả người dùng từ xa hoặc thêm ký tự đại diện thay vì Localhost
OneCricketeer

0

Nó đã cố gắng kết nối với phiên bản cũ hơn của MySQL ('phiên bản', '5.1.73'); khi bạn sử dụng phiên bản trình điều khiển mới hơn, bạn sẽ gặp lỗi cho bạn sử dụng "com.mysql.cj.jdbc.Driver hoặc thậm chí bạn không phải sử dụng phiên bản nào bạn sử dụng:

Đang tải lớp com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver '. Trình điều khiển được đăng ký tự động thông qua SPI và tải thủ công của lớp trình điều khiển nói chung là không cần thiết.

Tôi đã thay đổi khai báo để sử dụng phiên bản 5.1,38 của mysql-Connector-java và, trong mã, tôi giữ nguyên com.mysql.jdbc.Driver .

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

Tất cả bắt đầu khi tôi thấy câu trả lời của Ankit Jain


0

Tường lửa của tôi đã chặn bài 3307 mà MySQL của tôi đang nghe. Vì vậy, tôi đã thay đổi cổng từ 3307 thành 3306. Sau đó tôi có thể kết nối thành công với cơ sở dữ liệu.


0

Trong MacBook của tôi, tôi chỉ khắc phục lỗi này khi cài đặt lại phiên bản mới của nhật thực EE và xóa các máy chủ cục bộ như xamp mysql hoặc mamp nhưng chỉ sử dụng một trong số chúng ...


0

Trong trường hợp của tôi, tôi đã phải thiết lập một đường hầm ssh đến cơ sở dữ liệu từ xa và tất cả các cài đặt đều chính xác và thử nghiệm kết nối với PhpStorm cũng thành công. Và cũng là lược đồ đã được tải, nhưng không phải là dữ liệu. Thay vào đó tôi có:

[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.

Không có gợi ý nào ở trên có tác dụng. Vì bất kỳ lý do gì, tôi đã cố gắng giải quyết vấn đề bằng cách khởi động lại PhpStorm và voila nó đã hoạt động!


0

Tôi đã nhận được nhiều lỗi như:

  • 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.

Tôi đã phải thêm:

  • Trong AndroidManifest.xml bao gồm <uses-permission android:name="android.permission.INTERNET"/>ngay sau thẻ kê khai mở.

  • Thêm trình điều khiển JDBC vào các phụ thuộc Gradle (hoặc Maven) của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.