Spring-_-Bear 的 CSDN 博客导航
使用
-Djava.net.preferIPv4Stack=true
解决 JVM 使用 IPv6 而 VPN 使用 IPv4 导致 Java 应用不能连接远程 MySQL 的问题
一、问题描述
如图所示:
-
在本地主机和远程服务器的控制台通过
mysql -u -p
命令连接到10.98.64.32:3306
MySQL 数据库时均成功 -
在本地 IDEA IDE 中点击运行
main
方法时却连接不上远程的10.98.64.32:3306
MySQL 数据库,抛出com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
异常 -
在本地主机 DOS 控制台通过
java -jar
运行打包好的 jar 包时也连接不到远程的 MySQL,但将jar
包上传到远程服务器后,在服务器的命令行终端通过java -jar
运行 jar 包却可以正常连接到10.98.64.32:3306
MySQL 数据库
那问题很多的小明不禁就要问了,为什么会出现这么奇奇怪怪的问题呢?
二、原因分析
-
在本地主机和远程服务器的控制台通过
mysql -u -p
命令连接到10.98.64.32:3306
MySQL 数据库均成功,说明 MySQL 服务一切正常 -
在远程服务器的命令行终端通过
java -jar
能成功连接10.98.64.32:3306
MySQL 数据库,说明程序代码没有问题 -
在本地主机的 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 包,问题得以解决
文章评论