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:
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"
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.
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 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
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.