繁体   English   中英

无法从java连接到mysql服务器

[英]Cannot connect to mysql server from java

我在这行代码中收到错误"Communications link failure"

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

我查了这篇文章中的所有内容:

  • 我在etc / mysql中增加了my.cnf中的max-allowed-packet:max_allowed_pa​​cket = 5073741824 ------ [mysqldump] max_allowed_pa​​cket = 1G
  • 绑定地址是:127.0.0.1
  • 所有超时值都等于一个数字
  • Tomcat尚未安装在服务器上(新服务器)
  • my.cnf中没有跳过网络
  • 我可以ping服务器
  • 我通过ssh连接到mysql数据库

当我将查询字符串更改为:

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

我收到错误Packet for query is too large (4739923 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable. Packet for query is too large (4739923 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

虽然我已经改变了my.cnf上的数据包大小,然后重新启动了mysql服务。

有什么建议?

注意:

我可以通过ssh与这段代码连接,但这种方式似乎不合理! 我可以在main中连接一次然后我应该将连接传递给所有类。

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();
        }
    }

看看这里 看下面描述了您的情况

可以传输到MySQL 5.7服务器或客户端的最大可能数据包是1GB。

当MySQL客户端或mysqld服务器收到大于max_allowed_pa​​cket字节的数据包时,它会发出ER_NET_PACKET_TOO_LARGE错误并关闭连接。 对于某些客户端,如果通信包太大,您在查询错误期间也可能会失去与MySQL服务器的连接。

客户端和服务器都有自己的max_allowed_pa​​cket变量,因此如果要处理大数据包,则必须在客户端和服务器中增加此变量。

因此,您似乎还需要更改客户端上的max_allowed_packet

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

我将/ etc / mysql中my.cnf文件中的绑定地址更改为服务器的ip地址,解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM