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线.因 ...
随机推荐
- WPF Prism框架Region失效了?
站长最近转载了痕迹的Prism 8系列博文,不知道你对该框架是否有一定了解了?不了解,可以看看本号转载的系列: WPF Prism框架合集(2.创建Prism应用程序) WPF Prism框架合集(3 ...
- 【TouchGFX 】使用 CubeMX 创建 TouchGFX 工程时 LCD 死活不显示
生成的代码死活无法让LCD显示,经两个晚上的分析验证是LTDC_CLK引脚速度设置为低速导致,经测试中速.高速.超高速都正常,真是冤,聊以此以示纪念
- NewStarCTF 2023 公开赛道 WEEK2|CRYPTO全解
一.滴啤 题目信息 from Crypto.Util.number import * import gmpy2 from flag import flag def gen_prime(number): ...
- vscode插件 - 浏览器中自动刷新 Live Server
- [转帖]SpringBoot项目banner.txt生成教程
文章目录 近期在做毕业设计,后端框架用到了SpringBoot,可以自己个性化设置banner.txt 地址:https://www.bootschool.net/ascii 可以直接下载,然后直接将 ...
- nginx 进行目录浏览的简单配置
1. 公司网络安全不让用vsftpd的匿名网络访问了, 没办法 只能够使用 nginx 通过http协议来处理. 2. 最简单的办法就是另外开一个nginx进程简单设置一下nginx的配置文件 wor ...
- [转贴]一图弄懂ASCII、GB2312、GBK、GB18030编码
一图弄懂ASCII.GB2312.GBK.GB18030编码 https://blog.csdn.net/LightUpHeaven/article/details/92008630 转载君子不器. ...
- Systemd设置ulimit的方式与方法
Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为syste ...
- log4j-漏洞修复
Log4j漏洞修复 修复参考文档:https://www.cert.org.cn/publish/main/9/2021/20211215154225883558274/202112151542258 ...
- 感受 Vue3 的魔法力量
作者:京东科技 牛至伟 近半年有幸参与了一个创新项目,由于没有任何历史包袱,所以选择了Vue3技术栈,总体来说感受如下: • setup语法糖<script setup lang=" ...