Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giải quyết lỗi liên kết truyền thông với JDBC và MySQL

Tôi đã gặp vấn đề tương tự trong hai chương trình của mình. Lỗi của tôi là thế này:

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 vài ngày để giải quyết vấn đề này. Tôi đã thử nghiệm nhiều cách tiếp cận đã được đề cập trên các trang web khác nhau, nhưng không có cách nào trong số đó 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 cho bạn biết về các cách tiếp cận khác nhau và tổng hợp chúng ở đây .

Trong khi tìm kiếm trên Internet để tìm giải pháp cho lỗi này, tôi đã phát hiện ra rằng có nhiều giải pháp hiệu quả với í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ó sự cố trong kết nối với máy chủ . Có thể sự cố là do chuỗi truy vấn sai hoặc quá nhiều kết nối với 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 lần lượ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 giải pháp, ít nhất có một người đã giải quyết được vấn đề của mình bằng giải pháp đó.

Mẹo:Để biết các giải pháp mà bạn cần thay đổi cài đặt MySQL, bạn có thể tham khảo các tệp sau:

  • Linux:/etc/mysql/my.cnf hoặc /etc/my.cnf (tùy thuộc vào bản phân phối Linux và gói MySQL được sử dụng)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Lưu ý đó là Dữ liệu Chương trình, không phải Tệp Chương trình)

Đây là các giải pháp:

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

    Bỏ ghi chú bind-address hoặc thay đổi nó thành một trong các IP sau:

     bind-address="127.0.0.1"
    

    hoặc

     bind-address="0.0.0.0"
    
  • nhận xét về "bỏ qua mạng"

    Nếu có skip-networking trong tệp cấu hình MySQL của bạn, làm cho nó nhận xét bằng cách thêm # ký ở đầu dòng đó.

  • thay đổi "wait_timeout" và "tương tác_timeout"

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

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Đảm bảo Java không dịch 'localhost' thành [:::1] thay vì [127.0.0.1]

    Vì MySQL nhận ra 127.0.0.1 (IPv4 ) chứ không phải :::1 (IPv6 )

    Điều này có thể tránh được bằng cách sử dụng một trong hai cách tiếp cận:

    1. Trong chuỗi kết nối, hãy sử dụng 127.0.0.1 thay vì localhost để tránh localhost được dịch sang :::1

    2. Chạy java với tùy chọn -Djava.net.preferIPv4Stack=true để buộc java sử dụng IPv4 thay vì IPv6 . Trên Linux, điều này cũng có thể đạt được bằng cách chạy (hoặc đặt nó bên trong /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • kiểm tra cài đặt proxy Hệ điều hành, tường lửa và chương trình chống vi-rút

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

    Dừng iptables tạm thời trên linux. Nếu iptables được định cấu hình sai, chúng có thể cho phép gửi các gói tcp đến cổng mysql, nhưng chặn các gói tcp quay trở lại trên cùng một kết nối.

     # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop
    

    Dừng phần mềm chống vi-rút trên Windows.

  • 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 phải giống như sau:

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

Đảm bảo rằng bạn không có khoảng trắng trong chuỗi của mình. Tất cả chuỗi kết nối sẽ được tiếp tục mà không có bất kỳ ký tự khoảng trắng nào.

Cố gắng thay thế "localhost" bằng địa chỉ loopback 127.0.0.1. Ngoài ra, hãy thử thêm số cổng vào chuỗi kết nối của bạn, chẳng hạ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ố 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 validationQuery

sử dụng validationQuery ="select now ()" để đảm bảo mỗi truy vấn đều có phản hồi

  • Tự động kết nố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ù những giải pháp này không phù hợp với tôi, nhưng tôi khuyên bạn nên thử chúng. Bởi vì có một số người đã giải quyết được vấn đề của họ bằng cách làm theo các bước sau.

Nhưng điều gì đã giải quyết được 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 một 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à cho tôi lỗi đó. Những gì tôi đã làm là tôi đã xác định biến kết nối của mình là một 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 lần tôi chỉ sử dụng kết nối đó. Nó giải quyết được vấn đề của tôi và cũng làm tăng tốc độ của tôi lên đáng kể.

# 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 các giải pháp trên. Nếu bạn gặp lỗi này ở đầ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 sự cố trong chuỗi kết nối của mình. Nhưng nếu bạn gặp lỗi này sau một vài lần tương tác thành công với cơ sở dữ liệu, thì vấn đề có thể là với 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 để giảm số lượng kết nối.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL cho biết:Tài liệu # 1045 - Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:NO)

  2. MySQL COUNT DISTINCT

  3. Giải thích về khung khả dụng cao của MySQL - Phần II:Sao chép bán đồng bộ

  4. Chỉ mục giải quyết cho người dùng bảng bị hỏng; cố gắng sửa chữa nó

  5. 4 cách để kiểm tra kiểu dữ liệu của cột trong MySQL