Windows下,SpringBoot JDBC无法连接的问题
问题症状
在Win7和Win10下启动时均会出现下面的错误,但是在OSX和Linux下没问题
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 18,982 milliseconds ago. The last packet sent successfully to the server was 18,979 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
...
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2966)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3427)
... 166 common frames omitted
配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
aservice:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.1.2:3306/aservice?useUnicode=true&characterEncoding=utf8
username: dbuser
password: dbuser
bservice:
...
...
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
对应的各组件版本为
spring-boot-dependencies:2.1.17.RELEASE
druid-spring-boot-starter:1.1.17
mysql-connector-java:auto --> 8.0.21
检查过程
排除网络及MySQL服务器账号问题:用客户端可以正常连接,同样的代码在OSX和Ubuntu20.04下均可正常连接。如果通过公网opnvpn连接到内网,在windows下也可以正常连接
排除mysql-connector-java版本不兼容问题:切换到8.0.16和5.1.46后问题依旧
排除mysql-connector-java自身问题:仅使用spring-jdbc + mysql-connector-java 可以正常连接
在SpringBoot:2.2.4.RELEASE + hikari的项目B上,在同样的内网环境连接此数据库,无法连接。因此问题范围可以缩小到SpringBoot上。
这个项目里出现的错误不太一样,是
201030 14:09:11275 main W xxer.hikari.pool.PoolBase#481 HikariPool-1 - Default transaction isolation level detection failed (No operations allowed after connection closed.).
201030 14:09:11279 main E er.hikari.pool.HikariPool#493 HikariPool-1 - Error thrown while acquiring connection from data source
java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73)
at com.mysql.cj.jdbc.ConnectionImpl.setTransactionIsolation(ConnectionImpl.java:2279)
...
at com.rockbb.banyan.commons.impl.CommonsBoot.main(CommonsBoot.java:14)
Caused by: com.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
at com.mysql.cj.NativeSession.checkClosed(NativeSession.java:1274)
at com.mysql.cj.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:575)
at com.mysql.cj.jdbc.ConnectionImpl.setTransactionIsolation(ConnectionImpl.java:2226)
... 70 common frames omitted
在项目B上,通过debug发现连接关闭这个状态是通过NativeSession.forceClose()设置的,调用栈是
com.mysql.cj.jdbc.ConnectionImpl.abortINternal()
com.mysql.cj.jdbc.ConnectionImpl.isValid()
com.zaxxer.hikari.pool.PoolBase.checkValidationSupport()
在这个方法里,判断连接是否有效有两种方法,
if (this.isUseJdbc4Validation) {
connection.isValid(1);
} else {
this.executeSql(connection, this.config.getConnectionTestQuery(), false);
}
出错时使用的是前一种,这里timeout是固定的1秒,在这1秒内无返回就出错了。因为超时不能修改,所以要改用第二种,可以看到这个对象初始化时这个变量的赋值为
this.isUseJdbc4Validation = config.getConnectionTestQuery() == null;
所以只需要配置中有connection-test-query: "SELECT 1"这一项就可以了,在hikari的配置中加上这项,程序就可以正常运行了。
回到项目A,项目A使用的是DruidDatasource, 没有上面的这个参数项,配置这个不起作用。
对项目中出现异常的部分加断点debug,可以发现异常的来源是com.mysql.cj.protocol.ReadAheadInputStream.fill(), 实际的错误来源是socket read timeout,这个类里有一个doDebug变量可以控制是否输出socket读写的信息,再继续跟踪得到这个选项是traceProtocol=true, 要配置到dbUrl上。
打开这个信息后发现,实际上连接出错是在和服务器多次交互后才发生的。
继续跟踪,连接的关闭是在这个方法后发生的com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker.isValidConnection(...),这个方法里通过ping和sql查询两种方式检查连接有效性,并且查询的timeout也是1秒,所以先修改timeout试试,在druid的配置上加上
validationQueryTimeout: 30
后,debug中可以发现确实ping阻塞在那里直到超时也无返回,所以这个不能解决问题,再尝试换成另一种方式检查有效性。这个开关字段是usePingMethod,经过检查,这个参数不能通过application.yml带入,要加在java启动时的命令行,加上-Ddruid.mysql.usePingMethod=false这个参数启动后,就会通过SELECT 1去检查连接有效性,这个检测就没问题。因为超时时间也使用于这个检测,所以最终解决方案是
- 启动命令行中加上 -Ddruid.mysql.usePingMethod=false 参数
- application.yml的Druid配置中加上 validationQueryTimeout: 30 和 validationQuery: SELECT 1这两项
Windows下,SpringBoot JDBC无法连接的问题的更多相关文章
- Windows下用C语言连接Mysql注意问题
原文:Windows下用C语言连接Mysql注意问题 环境是:在VS6.0 安装Mysql后,我们需要相应的头文件以及lib文件,所以安装过程必须是完整安装.否则不会生成include文件夹哦~ 具体 ...
- 转 windows下安装pycharm并连接Linux的python环境 以及 windows 下notepad ++编辑 linux 的文件
######sample 1:windows下安装pycharm并连接Linux的python环境 https://www.cnblogs.com/junxun/p/8287998.html wind ...
- windows下使用xShell远程连接virtualbox里面的linux
第一阶段:基本安装 安装virtual box 在virtualbox里面安装xubuntu:是ubuntu+xfce桌面环境的一个linux的发行版本 在windows下安装Xmanager Ent ...
- [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat
本文地址:http://blog.csdn.net/sushengmiyan/article/details/43154543 本文作者:sushengmiyan ------------------ ...
- windows下安装pycharm并连接Linux的python环境
1. 下载安装Pycharm专业版 具体方法略.Pycharm5激活方法参考http://www.cnblogs.com/snsdzjlz320/p/7110186.html 2. 添加配置连接远程服 ...
- 3.Ubuntu下安装mysql并在windows下使用Navicat来连接
一.安装mysql(只需要三条命令) 1.第一条命令(中间需要输入root用户密码): sudo apt-get install mysql-server 2.第二条命令: sudo apt-get ...
- [转载+补充][PY3]——环境配置(2)——windows下安装pycharm并连接Linux的python环境
原文地址:<你所会用到的Python学习环境和工具> 1. 下载安装Pycharm专业版 具体方法略.Pycharm5激活方法参考http://www.cnblogs.com/snsdzj ...
- 在 windows 下搭建 IDEA + Spark 连接 Hive 的环境
为了开发测试方便,想直接在 IDEA 里运行 Spark 程序,可以连接 Hive,需不是打好包后,放到集群上去运行.主要配置工作如下: 1. 把集群环境中的 hive-core.xml, hdfs- ...
- Windows下通过SSH无密码连接Linux服务器
一.配置环境 1.本机系统:Windows 10 Pro(64位) 2.服务器:CentOS 6.10(64位) 3.SSH连接软件:SecureCRT 二.配置SSH无密码登录步骤 1.在个人PC机 ...
- Windows下使用console线连接思科交换机
在XP下可以直接使用内置工具"超级终端",在win7或者更高版本需要下载安装SecureCRT. 本文假设已经下载安装好了SecureCRT. 首先,将电脑连接console线.因 ...
随机推荐
- DC - 设计和工艺数据
环境建立命令与变量 综合主要的三部分:RTL\目标工艺库\约束文件 DC综合过程中timing > area,在时序满足的条件下进行面积优化 RTL一般会映射为standcell(与非门),需要 ...
- Makeflie脚本使用
1.目标 2.Makefile的作用 自动化编译仿真 文件有引用层级关系,Tb会引用RTL顶层,RTL顶层也会引用一些其他的小的模块,编译的时候被引用的文件需要先进行编译. 脚本有两种模式,debug ...
- Keep English Level-02
change -- n 零钱 climate change -- 气候变化 exchange -- 交换,兑换(金融) exchange rate -- 汇率 move -- 感动,改变,移动 (n) ...
- idea侧边栏commit消失
1.问题 在使用Clion中想要查看提交的相关信息,发现侧边栏commit消失 2.解决方法 打开设置,选择会用非模式提交界面即可
- 【Freertos】任务切换分析
任务切换实现 xPortPendSVHandler: mrs r0, psp // 获取进入异常时的进程栈 isb ldr r3, =pxCurrentTCB // 加载线程控制块地址到r3 ldr ...
- linux获取文件或者是进程精确时间的方法
linux获取文件或者是进程精确时间的方法 背景 很多时候需要精确知道文件的具体时间. 也需要知道进程的开始的精确时间. 便于进行一些计算的处理. 其实linux里面有很多方式进行文件属性的查看. 这 ...
- [转帖]备份与恢复工具 BR 简介
https://docs.pingcap.com/zh/tidb/v4.0/backup-and-restore-tool BR 全称为 Backup & Restore,是 TiDB 分布式 ...
- [转帖]Kafka故障之磁盘打满
https://www.jianshu.com/p/095e820361ae 问:磁盘打满扩容后能正常重启吗?答:不一定 要看文件格式是否损坏(log.index等).如果损坏会报错:index fi ...
- [转帖]JVM——内存区域:运行时数据区域详解
https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了 ...
- [转帖]apt update和apt upgrade命令 - 有什么区别?
在之前的文章中,我们查看了APT 命令以及您可以使用包管理器来管理包的各种方法.这是一个总体概述,但在本指南中,我们暂停并重点关注 2 个命令用法.这些是apt update和apt upgrade命 ...