解决 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure 异常
这篇博客详细讨论了如何解决在使用 VPN 时 JVM 使用 IPv6 而导致 Java 应用无法连接到远程 MySQL 数据库的问题。作者分析了问题原因,并提出了一种简单有效的解决方案:在 JVM 启动参数中添加 -Djava.net.preferIPv4Stack=true,以强制 JVM 使用 IPv4 栈。此方法适用于本地 IDEA IDE 环境和 DOS 控制台中的 Java 应用。
使用
-Djava.net.preferIPv4Stack=true解决 JVM 使用 IPv6 而 VPN 使用 IPv4 导致 Java 应用不能连接远程 MySQL 的问题
一、问题描述

如图所示:
-
在本地主机和远程服务器的控制台通过
mysql -u -p命令连接到10.98.64.32:3306MySQL 数据库时均成功 -
在本地 IDEA IDE 中点击运行
main方法时却连接不上远程的10.98.64.32:3306MySQL 数据库,抛出com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure异常
-
在本地主机 DOS 控制台通过
java -jar运行打包好的 jar 包时也连接不到远程的 MySQL,但将jar包上传到远程服务器后,在服务器的命令行终端通过java -jar运行 jar 包却可以正常连接到10.98.64.32:3306MySQL 数据库
那问题很多的小明不禁就要问了,为什么会出现这么奇奇怪怪的问题呢?
二、原因分析
-
在本地主机和远程服务器的控制台通过
mysql -u -p命令连接到10.98.64.32:3306MySQL 数据库均成功,说明 MySQL 服务一切正常 -
在远程服务器的命令行终端通过
java -jar能成功连接10.98.64.32:3306MySQL 数据库,说明程序代码没有问题 -
在本地主机的 IDEA IDE 环境运行源代码和在 DOS 控制台运行 jar 包时均不能连接到 MySQL 数据库,说明问题仅仅存在本地。在 第 2 步 中证明了程序代码不存在问题,那么问题的根源只能存在于运行代码的载体
JVM身上。分析到此,经与有经验的同事沟通,发现本地主机连接到远程服务器时需要通过 VPN 进行中转,VPN 通过劫持的方式转发网络请求,并且使用
IPv4栈,而高版本的JDK中更倾向于使用IPv6栈,所以可以通过在本地配置JVM使用IPv4栈的方式解决问题。
三、解决方案
经由 二、原因分析 的剖析 ,得出解决方案如下:
-
本地 IDEA IDE 环境中,启动时程序配置使用
IPv4栈,即使用-Djava.net.preferIPv4Stack=true进行配置,从而解决问题
再次运行程序,服务正常启动,输出如下:

-
本地 DOS 控制台:同理,直接使用
java -Djava.net.preferIPv4Stack=true -Dspring.profiles.active=dev -jar ops-gateway-server.jar命令启动 jar 包,问题得以解决
更多推荐




所有评论(0)