无法从Java连接到MySQL服务器

5
我在这行代码遇到了"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_packet = 5073741824------ [mysqldump] max_allowed_packet = 1G
  • bind-address是127.0.0.1
  • 所有超时值都相同
  • 服务器上尚未安装Tomcat(新服务器)
  • my.cnf中没有skip-networking
  • 我可以ping通服务器
  • 我通过ssh连接到mysql数据库

当我将查询字符串更改为以下内容时:

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

我遇到了错误:“查询数据包太大(4739923 > 1048576)。您可以通过设置'max_allowed_packet'变量来在服务器上更改此值。”
虽然我已经在my.cnf中更改了数据包大小,并在此之后重新启动了mysql服务。有什么建议吗?
注意:
我可以通过ssh连接,但这种方法似乎不是很合理!我可以在主函数中连接一次,然后将连接传递给所有类。
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
你能否对服务器进行 ping 测试? - Raúl
如果MySQL数据库是远程的,您是否正确配置了权限? - John
1
请同时查看https://dev59.com/InI95IYBdhLWcg3w2h56。 - Raúl
1
我目前通过ssh连接到服务器,并且可以在命令提示符中使用mysql。我在问题中提到的那一行代码出现了错误,但我还没有运行任何SQL查询。 - Andi Keikha
1
我可以ping通服务器。 - Andi Keikha
显示剩余6条评论
2个回答

3

请看这里。 以下内容描述了您的情况:

MySQL 5.7服务器或客户端可以发送或接收的最大数据包为1GB。

当MySQL客户端或mysqld服务器接收到超过max_allowed_packet字节的数据包时,它会发出ER_NET_PACKET_TOO_LARGE错误并关闭连接。如果通信数据包太大,则有些客户端还会出现“在查询期间与MySQL服务器的连接丢失”错误。

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

所以,看起来您需要在客户端上更改max_allowed_packet

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

你能否也尝试使用SSH连接吗? - Yuri G.
mySqlCon = DriverManager.getConnection("jdbc:mysql://**server ip address**:22/127.0.0.1:3306/db-name?max_allowed_packet=5073741824", "mu-user-name", "my-password"); - Yuri G.
哦,我都试过了。还是和之前一样的错误。我也尝试将max_allowed_packet的值更改为小于此值的其他值,并且两种情况都试过了。仍然是相同的错误。 - Andi Keikha

0

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


1
很高兴听到你已经解决了这个问题,感谢你的更新。 - Yuri G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接