问题症状

在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无法连接的问题的更多相关文章

  1. Windows下用C语言连接Mysql注意问题

    原文:Windows下用C语言连接Mysql注意问题 环境是:在VS6.0 安装Mysql后,我们需要相应的头文件以及lib文件,所以安装过程必须是完整安装.否则不会生成include文件夹哦~ 具体 ...

  2. 转 windows下安装pycharm并连接Linux的python环境 以及 windows 下notepad ++编辑 linux 的文件

    ######sample 1:windows下安装pycharm并连接Linux的python环境 https://www.cnblogs.com/junxun/p/8287998.html wind ...

  3. windows下使用xShell远程连接virtualbox里面的linux

    第一阶段:基本安装 安装virtual box 在virtualbox里面安装xubuntu:是ubuntu+xfce桌面环境的一个linux的发行版本 在windows下安装Xmanager Ent ...

  4. [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/43154543 本文作者:sushengmiyan ------------------ ...

  5. windows下安装pycharm并连接Linux的python环境

    1. 下载安装Pycharm专业版 具体方法略.Pycharm5激活方法参考http://www.cnblogs.com/snsdzjlz320/p/7110186.html 2. 添加配置连接远程服 ...

  6. 3.Ubuntu下安装mysql并在windows下使用Navicat来连接

    一.安装mysql(只需要三条命令) 1.第一条命令(中间需要输入root用户密码): sudo apt-get install mysql-server 2.第二条命令: sudo apt-get ...

  7. [转载+补充][PY3]——环境配置(2)——windows下安装pycharm并连接Linux的python环境

    原文地址:<你所会用到的Python学习环境和工具> 1. 下载安装Pycharm专业版 具体方法略.Pycharm5激活方法参考http://www.cnblogs.com/snsdzj ...

  8. 在 windows 下搭建 IDEA + Spark 连接 Hive 的环境

    为了开发测试方便,想直接在 IDEA 里运行 Spark 程序,可以连接 Hive,需不是打好包后,放到集群上去运行.主要配置工作如下: 1. 把集群环境中的 hive-core.xml, hdfs- ...

  9. Windows下通过SSH无密码连接Linux服务器

    一.配置环境 1.本机系统:Windows 10 Pro(64位) 2.服务器:CentOS 6.10(64位) 3.SSH连接软件:SecureCRT 二.配置SSH无密码登录步骤 1.在个人PC机 ...

  10. Windows下使用console线连接思科交换机

    在XP下可以直接使用内置工具"超级终端",在win7或者更高版本需要下载安装SecureCRT. 本文假设已经下载安装好了SecureCRT. 首先,将电脑连接console线.因 ...

随机推荐

  1. [转帖]漏洞预警|Apache Tomcat 信息泄露漏洞

    http://www.hackdig.com/03/hack-953615.htm 棱镜七彩安全预警 近日网上有关于开源项目Apache Tomcat 信息泄露漏洞,棱镜七彩威胁情报团队第一时间探测到 ...

  2. iperf的学习与部分网络状况的简要总结

    背景 随着信息安全的越来越重要,公司要求进行数据备份. 部分客户现场交付之前需要进行性能压测,但是因为各种环境问题效果不是很理想. 前段时间疫情严重,经常需要居家办公,出现了很多网络相关的问题. 因为 ...

  3. 京东金融Android瘦身探索与实践

    作者:京东科技 冯建华 一.背景 随着业务不断迭代更新,App的大小也在快速增加,2019年~2022年期间一度超过了117M,期间我们也做了部分优化如图1红色部分所示,但在做优化的同时面临着新的增量 ...

  4. 【DS】【AtCoder】Pakencamp 2022 Day2 H

    2023.6.30 Problem Link 有 \(n\) 个帮派在打架,每个帮派有一个大小 \(a_i\),每相邻两个帮派有一个仇恨度 \(b_i\).现在有 \(Q\) 次单点修改 \(a_i\ ...

  5. golang实现的 https 协议的四层代理和七层代理

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 四层代理 在 tcp 这一层转发很简单. http 协议是 ...

  6. Flask四剑客

    目录 Flask四剑客 Flask四剑客 ''' 响应字符串 响应html页面 跳转页面 返回json字符串 ''' from flask import Flask, render_template, ...

  7. ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析

    目录 建表语法 使用场景 合并算法 使用例子. 资料分享 参考文章 VersionedCollapsingMergeTree引擎继承自MergeTree并将折叠行的逻辑添加到合并数据部分的算法中.Ve ...

  8. 将input 中的小写字母转化为大写字母

    小写转换为大写,使用toLocaleUpperCase() options.element.find(".CarNumber").textbox({ label: '车牌号:', ...

  9. vim 从嫌弃到依赖(20)——global 命令

    在前面的文章中,我们介绍了如何进行查找和替换,而替换是建立在查找基础之上的一个简单的应用,它只是将匹配文本修改为另一个.那么vim中还能针对匹配上的文本做哪些操作呢?在本篇文章中我们来对这个问题进行探 ...

  10. python处理Excel实现自动化办公教学(含实战)【一】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...