2015-05-20 34 views
5

tôi nhận được lỗi "Communications link failure" tại dòng mã này:Không thể kết nối đến máy chủ mysql từ java

mySqlCon = DriverManager.getConnection("jdbc:mysql://**server ip address**:3306/db-name", "mu-user-name", "my-password"); 

Tôi đã kiểm tra tất cả mọi thứ trong this post:

  • tôi tăng max-phép-gói trong tôi. cnf trong etc/mysql: max_allowed_packet = 5073741824 ------ [mysqldump] max_allowed_packet = 1G
  • Địa chỉ liên kết là: 127.0.0.1
  • Tất cả giá trị hết giờ đều bình đẳng đối với một số
  • Tomcat chưa được cài đặt trên máy chủ (server mới)
  • Không có bỏ qua-mạng trong my.cnf
  • Tôi có thể ping máy chủ
  • Tôi đang kết nối với cơ sở dữ liệu mysql qua ssh

Khi tôi thay đổi chuỗi truy vấn để này:

mySqlCon = DriverManager.getConnection("jdbc:mysql://**server ip address**:22/127.0.0.1:3306/db-name", "mu-user-name", "my-password"); 

tôi nhận được lỗi Packet for query is too large (4739923 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

Trong khi tôi đã thay đổi kích thước gói trên my.cnf và khởi động lại dịch vụ mysql sau đó.

Mọi đề xuất?

LƯU Ý:

Tôi có thể kết nối thông qua ssh với mã này, nhưng cách này có vẻ không hợp lý! Tôi có thể kết nối một lần trong chính và sau đó tôi nên vượt qua kết nối đến tất cả các lớp học.

public my-class-constructor() { 

     try { 
      go(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mySqlCon = null; 
     String driver = "com.mysql.jdbc.Driver"; 
     String url = "jdbc:mysql://" + rhost + ":" + lport + "/"; 
     String db = "my-db-name"; 
     String dbUser = "dbuser"; 
     String dbPasswd = "pass"; 
     try { 
      Class.forName(driver); 
      mySqlCon = DriverManager.getConnection(url + db, dbUser, dbPasswd); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void go() { 
     String user = "ssh-user"; 
     String password = "ssh-pass"; 
     String host = "ips-address"; 
     int port = 22; 
     try { 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, port); 
      lport = 4321; 
      rhost = "localhost"; 
      rport = 3306; 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      System.out.println("Establishing Connection..."); 
      session.connect(); 
      int assinged_port = session.setPortForwardingL(lport, rhost, rport); 
      System.out.println("localhost:" + assinged_port + " -> " + rhost 
        + ":" + rport); 
     } catch (Exception e) { 
      System.err.print(e); 
      e.printStackTrace(); 
     } 
    } 
+3

Bạn có thể ping máy chủ không? –

+0

có vẻ như truy vấn của bạn quá lớn, hãy thử truy vấn nhỏ hơn, ví dụ: "chọn * từ bảng giới hạn 10;" – nafas

+0

Nếu cơ sở dữ liệu MySQL là từ xa, bạn đã cấu hình các điều khoản chính xác chưa? – John

Trả lời

0

tôi đã thay đổi địa chỉ ràng buộc trong file my.cnf trong/etc/mysql đến địa chỉ IP của máy chủ và giải quyết vấn đề.

+1

điều tốt khi biết rằng bạn đã quản lý điều này, cảm ơn bạn đã cập nhật –

+0

Cảm ơn sự giúp đỡ của bạn :) – Andi

3

Hãy xem here. Hình sau đây mô tả trường hợp của bạn

Các gói lớn nhất có thể có thể được chuyển đến hoặc từ một 5,7 máy chủ MySQL hoặc khách hàng là 1GB.

Khi máy khách MySQL hoặc máy chủ mysqld nhận được gói lớn hơn max_allowed_packet byte, nó phát hành ER_NET_PACKET_TOO_LARGE lỗi và đóng kết nối. Với một số khách hàng, bạn cũng có thể nhận được kết nối bị mất tới máy chủ MySQL trong khi truy vấn lỗi nếu gói giao tiếp quá lớn.

Cả khách và máy chủ đều có biến max_allowed_packet riêng của mình , vì vậy nếu bạn muốn xử lý các gói lớn, bạn phải tăng biến này cả trong ứng dụng khách và máy chủ.

Vì vậy, có vẻ như bạn cần phải thay đổi max_allowed_packet trên máy khách cũng như:

mySqlCon = DriverManager.getConnection("jdbc:mysql://**server ip address**:3306/db-name?max_allowed_packet= 5073741824", "mu-user-name", "my-password"); 
+0

Nó không giải quyết được vấn đề. – Andi

+0

Bạn có thể thử kết nối ssh không? –

+0

Ý của bạn là gì? – Andi

Các vấn đề liên quan