Không thể kết nối với mysql thông qua trình kết nối JDBC thông qua Tomcat hoặc bên ngoài


17

Tôi đã cài đặt bản cài đặt mysql 5.5 và trong khi tôi có thể kết nối với dịch vụ mysql thông qua lệnh mysql và dịch vụ dường như đang chạy, tôi không thể kết nối với nó thông qua spring + tomcat hoặc từ trình kết nối jdbc bên ngoài.

Tôi đang sử dụng URL sau:

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

với tên người dùng / mật khẩu phù hợp, nhưng tôi nhận được thông báo sau:

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.

và ném tomcat:

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)

Có vẻ như đó là vấn đề giống như khi tôi cố gắng kết nối bên ngoài.


Tôi đã gặp phải vấn đề này khi cố gắng kết nối thông qua java với cơ sở dữ liệu mysql chạy trên một máy chủ khác trong mạng LAN của tôi. Khi thực hiện cùng một chương trình java trên máy chủ chạy mysql, nó đã kết nối mà không gặp vấn đề gì. từ máy bên ngoài, tôi có thể kết nối với cơ sở dữ liệu mysql bằng SQLYog chẳng hạn (mặc dù trước tiên tôi phải thay đổi tệp my.cnf để liên kết thành 0.0.0.0 thay vì 127.0.0.1). Câu trả lời của Boden và nhận xét về việc thay đổi trình kết nối JDBC đã chỉ cho tôi đi đúng hướng. Tôi đã thay đổi trình kết nối JDBC thành phiên bản mới nhất và đột nhiên nó hoạt động!
dùng2380870

Câu trả lời:


18

Điều này có thể xảy ra vì nhiều lý do. Tôi mới chỉ nhìn thấy nó vài tuần trước nhưng tôi không thể nhớ bản sửa lỗi là gì cho tôi.

1) Xác minh địa chỉ mysql bị ràng buộc, có lẽ là 127.0.0.1 (chỉ) mà tôi tin là mặc định (ít nhất là trên máy chủ Ubuntu tiêu chuẩn). Bạn sẽ phải nhận xét tham số địa chỉ liên kết trong my.cnf để liên kết với tất cả các địa chỉ có sẵn (bạn không thể chọn nhiều, đó là một hoặc tất cả).

2) Nếu nó bị ràng buộc với 127.0.0.1 và bạn không thể kết nối bằng "localhost", hãy đảm bảo rằng nó không phân giải thành địa chỉ IPv6 localhost thay vì IPv4. (hoặc chỉ sử dụng địa chỉ IP)

3) Kiểm tra hai lần và kiểm tra cổng mà mysql đang nghe.

4) Đảm bảo bạn đang sử dụng trình kết nối JDBC phù hợp cho JDK của mình.

5) Hãy chắc chắn rằng bạn không làm điều gì đó thực sự ngớ ngẩn như bắt đầu mysql với --skip-network.

Tôi nghĩ đề xuất đầu tiên của tôi có nhiều hứa hẹn nhất ... thực tế tôi nghĩ đó là nơi tôi đã thấy gần đây ... Tôi đã cố gắng kết nối với mysql từ xa (cũng trên Ubuntu 8.04).


Chỉ cần thêm 2 tuổi của tôi, thứ 4 làm việc cho tôi. Cảm ơn!
Janis Peisenieks

1
liên quan đến "Bạn sẽ phải nhận xét tham số địa chỉ liên kết trong my.cnf để liên kết với tất cả các địa chỉ khả dụng", mặc định bây giờ chỉ nghe trên localhost, vì vậy bạn có thể cần sử dụng dòng "bind-address = 0.0. 0,0 "trong [mysqld].
Palo

13

Tôi đã có cùng một vấn đề trong hai chương trình của tôi. Lỗi của tôi là:

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.

Tôi dành một số ngày để giải quyết vấn đề này. Tôi đã thử nghiệm nhiều phương pháp đã được đề cập trong các trang web khác nhau, nhưng không phải cách nào cũng hiệu quả. Cuối cùng tôi đã thay đổi mã của mình và tìm ra vấn đề là gì. Tôi sẽ cố gắng nói với bạn về các cách tiếp cận khác nhau và tổng hợp chúng ở đây .

Trong khi tôi đang tìm kiếm internet để tìm giải pháp cho lỗi này, tôi đã tìm ra rằng có nhiều giải pháp hiệu quả cho ít nhất một người, nhưng những người khác nói rằng nó không hiệu quả với họ! Tại sao có nhiều cách tiếp cận với lỗi này? Có vẻ như lỗi này có thể xảy ra nói chung khi có vấn đề trong việc kết nối với máy chủ . Có thể vấn đề là do chuỗi truy vấn sai hoặc quá nhiều kết nối đến cơ sở dữ liệu.

Vì vậy, tôi khuyên bạn nên thử tất cả các giải pháp từng cái một và đừng bỏ cuộc!

Dưới đây là các giải pháp mà tôi tìm thấy trên internet và đối với mỗi người trong số họ, ít nhất là về người mà vấn đề của anh ta đã được giải quyết với giải pháp đó.

point: Đối với các giải pháp mà bạn cần thay đổi cài đặt MySQL, bạn có thể tham khảo phần sau:

  • Linux: /etc/my.cnf

  • Windows: D: \ Tệp chương trình \ mysql \ bin \ my.ini

Dưới đây là các giải pháp:

  • thay đổi thuộc tính "bind-address"

Bỏ ghi chú thuộc tính "bind-address" hoặc thay đổi nó thành một trong những điều sau đây:

địa chỉ liên kết = "127.0.0.1"

hoặc là

địa chỉ liên kết = "0.0.0.0"

  • bình luận "bỏ qua mạng"

Nếu có một dòng "bỏ qua mạng" trong tệp cấu hình MySQL của bạn, hãy bình luận bằng cách thêm dấu "#" ở đầu dòng đó.

  • thay đổi "Wait_timeout" và "Interactive_timeout"

Thêm các dòng này vào tệp cấu hình MySQL:

chờ_timeout = số

tương tác_timeout = số

kết nối_timeout = số

  • kiểm tra cài đặt proxy hệ điều hành

Đảm bảo Tường lửa hoặc các phần mềm chống vi-rút không chặn dịch vụ MySQL.

  • thay đổi chuỗi kết nối

Kiểm tra chuỗi truy vấn của bạn. chuỗi kết nối của bạn sẽ giống như thế này:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

Hãy chắc chắn rằng bạn không có khoảng trắng trong chuỗi của bạn. Tất cả các chuỗi kết nối nên được tiếp tục mà không có bất kỳ ký tự khoảng trắng.

Hãy thử thay thế "localhost" bằng cổng của bạn, như 127.0.0.1. Cũng cố gắng thêm số cổng vào chuỗi kết nối của bạn, như:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Thông thường cổng mặc định cho MySQL là 3306.

Đừng quên thay đổi tên người dùng và mật khẩu thành tên người dùng và mật khẩu của máy chủ MySQL của bạn.

  • cập nhật tệp thư viện trình điều khiển JDK của bạn
  • kiểm tra các JDK và JRE khác nhau (như JDK 6 và 7)
  • không thay đổi max_allowed_packet

" max_allowed_packet " là một biến trong tệp cấu hình MySQL cho biết kích thước gói tối đa, không phải số lượng gói tối đa. Vì vậy, nó sẽ không giúp giải quyết lỗi này.

  • thay đổi bảo mật tomcat

thay đổi TOMCAT6_SECURITY = có thành TOMCAT6_SECURITY = không

  • sử dụng thuộc tính verifyQuery

sử dụng verifyQuery = "select now ()" để đảm bảo mỗi truy vấn đều có câu trả lời

  • Tự động kết nối lại

Thêm mã này vào chuỗi kết nối của bạn:

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

Mặc dù các giải pháp này không hiệu quả với tôi, tôi khuyên bạn nên thử chúng. Bởi vì có một số người giải quyết vấn đề của họ bằng cách làm theo các bước này.

Nhưng điều gì đã giải quyết vấn đề của tôi? Vấn đề của tôi là tôi đã có nhiều CHỌN trên cơ sở dữ liệu. Mỗi lần tôi tạo kết nối và sau đó đóng nó. Mặc dù tôi đã đóng kết nối mọi lúc, nhưng hệ thống phải đối mặt với nhiều kết nối và đưa ra lỗi đó. Những gì tôi đã làm là tôi đã định nghĩa biến kết nối của mình là biến công khai (hoặc riêng tư) cho cả lớp và khởi tạo nó trong hàm tạo. Sau đó, mỗi khi tôi chỉ sử dụng kết nối đó. Nó giải quyết vấn đề của tôi và cũng tăng tốc độ của tôi đáng kể.

Phần kết luận

Không có cách đơn giản và duy nhất để giải quyết vấn đề này. Tôi đề nghị bạn suy nghĩ về tình huống của riêng bạn và chọn giải pháp trên. Nếu bạn gặp lỗi này khi bắt đầu chương trình và bạn hoàn toàn không thể kết nối với cơ sở dữ liệu, bạn có thể gặp vấn đề trong chuỗi kết nối của mình. Nhưng nếu bạn gặp lỗi này sau vài lần tương tác thành công với cơ sở dữ liệu, vấn đề có thể là do số lượng kết nối và bạn có thể nghĩ đến việc thay đổi "Wait_timeout" và các cài đặt MySQL khác hoặc viết lại mã của bạn như thế nào để giảm số lượng kết nối.


Tôi cũng gặp vấn đề này! Nhưng ban đầu tôi đã thay đổi mysql để nghe cổng 8888 thay vì 3306. SO, câu trả lời của @ sohail đã giúp, tôi chỉ cần thêm cổng 8888 vào uri của mình và nó đã hoạt động! Cảm ơn rất nhiều

Điều này giải quyết các vấn đề đối với tôi! Với thiết lập Vagrant Homestead của chúng tôi, vì một số lý do, nó đã ràng buộc với địa chỉ được cung cấp cho VM (10.0.2.15 trong trường hợp của tôi) thay vì localhost.
Tàu đổ bộ

1

Nếu bạn đang chạy cài đặt Linux, có thể bạn đã chặn lokkit chặn các liên lạc đến ngoại trừ thông qua SSH.

Đăng nhập bằng root và chạy lệnh lokkit từ dấu nhắc, tắt tường lửa và SElinux và xem bạn có gặp vấn đề tương tự không.

Ngoài ra kiểm tra quyền của bạn đã được đặt chính xác, vì vậy mọi thứ có thể ghi vào đúng vị trí.


Tôi đang chạy Ubuntu 8.04. Tôi có lẽ nên đề cập đến điều đó. Bạn có hướng dẫn cụ thể cho bản phân phối đó không? Tôi sẽ google ngay lập tức, nhưng tôi nghĩ tôi sẽ hỏi trước.
Stefan Kendall

sudo ufw vô hiệu hóa sẽ vô hiệu hóa Tường lửa Ubuntu
Stephen Thompson

Tôi đã cài đặt ufw và cố gắng kích hoạt cổng, nhưng không có xúc xắc.
Stefan Kendall

ufw và iptables đã được gỡ cài đặt. Tôi nghĩ rằng ufw là một công cụ quản lý phải được cài đặt riêng. Chắc chắn, "iptables" không mang lại lệnh như vậy và dường như không có dịch vụ iptables nào đang chạy.
Stefan Kendall

Cuối cùng, điều tôi thường thấy là bạn không cho phép mysql nghe trên giao diện eth0 và thường chỉ có trên giao diện localhost. Hãy thử như sau. Thay đổi jdbc: mysql: //myserver.com: myport / mydb thành jdbc: mysql: // localhost: myport / mydb nếu điều đó hoạt động, bạn cần thực hiện dev.mysql.com/doc/refman/5.1/vi/ không thể kết nối với máy chủ.html
Stephen Thompson


1

Điều này cũng có thể được gây ra bởi cài đặt proxy sai . Tôi gặp vấn đề này khi cố gắng kết nối qua jdbc với một phiên bản MySQL đang chạy trong thiết bị ảo Parallels trên máy Mac của tôi. Kết nối jdbc sử dụng cài đặt mạng cấp hệ thống và vì tôi đứng sau proxy SOCKS nên tôi phải đặt máy chủ MySql làm máy chủ không phải proxy (ví dụ: trên máy Mac, bạn có thể định cấu hình trong Cài đặt-> Mạng-> Nâng cao- > Proxy và cuối cùng thêm tên máy chủ hoặc địa chỉ IP trong "Bỏ qua cài đặt proxy cho các Máy chủ và Miền này").


1

MySQL Connector / J chỉ hỗ trợ TCP / IP Java không hỗ trợ kết nối ổ cắm tên miền Unix

Nếu MYSQL được bắt đầu với cờ bỏ qua hoặc nếu MySQL đang chạy phía sau tường lửa, thì tùy chọn TCP / IP bị tắt. Vì vậy, Java không thể giao tiếp với MySQL.


0

Tôi đã có một vấn đề rất giống nhau trong gần một ngày, và nó làm tôi phát điên! nhưng tôi đã tìm được giải pháp và nó rất đơn giản, bạn chỉ cần /etc/init.d/tomcat6 để thay đổi TOMCAT6_SECURITY = yes thành TOMCAT6_SECURITY = no. Đó không phải là giải pháp của tôi, tôi đã tìm thấy nó ở đây , như bạn có thể thấy, tôi đang chạy Ubuntu, hy vọng điều này sẽ hoạt động.


0

Tôi đã từng gặp vấn đề tương tự. Đã thay đổi thuộc tính "bind-address" trong tệp /etc/mysql/my.cnf thành 0.0.0.0 và nó hoạt động. Dòng tương ứng trong my.cnf trông như thế này:

địa chỉ liên kết = 0.0.0.0

Trước khi nó được đặt thành địa chỉ IP bên ngoài của máy chủ, vì vậy nó trông giống như:

địa chỉ liên kết = 196.152.4.145

Tôi nghĩ rằng khi nó được đặt thành địa chỉ IP bên ngoài chứ không phải vòng lặp localhost, máy chủ mysql chỉ được kết nối với card mạng và không lắng nghe các kết nối từ vòng lặp cục bộ.


0

thử địa chỉ địa phương của bạn để liên kết địa chỉ trong tập tin my.cnf

Kết nối 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();
    }
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.