最近系统间歇性很慢,比如登录,经常超时、无反应,查看log出现下述两种异常,
异常情况1

The last packet successfully received from the server was 995,202 milliseconds ago. The last packet sent successfully to the server was 995,202 milliseconds ago.at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)at com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2056)at com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:388)at com.zaxxer.hikari.pool.HikariProxyConnection.setAutoCommit(HikariProxyConnection.java)at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:284)... 44 common frames omitted

异常情况2

Caused by: 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.setNetworkTimeout(ConnectionImpl.java:2490)at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:550)at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:165)at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:179)... 30 common frames omitted

怀疑数据库链接存在死链,后端是springboot使用的默认数据库连接池hikari,配置如下

spring:datasource:driver: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://x.x.x.x:3306/dbname?useUnicode=true&characterEncoding=utf-8username: xxpassword: xxxxhikari:maximumPoolSize: 20maxLifetime: 60000minimumIdle: 10connectionTestQuery: SELECT 'x'

查看源码得知,com.zaxxer.hikari.pool.HikariPool#getConnection(long)获取连接时,判断连接是否存活,

com.zaxxer.hikari.pool.PoolBase#isConnectionAlive
boolean isConnectionAlive(final Connection connection)try {setNetworkTimeout(connection, validationTimeout);final int validationSeconds = (int) Math.max(1000L, validationTimeout) / 1000;//如果不配置connectionTestQuery,才会使用jdbc校验机制if (isUseJdbc4Validation) {return connection.isValid(validationSeconds);}}
 com.zaxxer.hikari.pool.PoolBase#PoolBasePoolBase(final HikariConfig config){this.config = config;this.isUseJdbc4Validation = config.getConnectionTestQuery() == null;}com.mysql.cj.jdbc.ConnectionImpl#isValidpublic boolean isValid(int timeout) throws SQLException {//发送心跳包pingInternal(false, timeout * 1000);return true;}

继续往下跟到了com.mysql.cj.protocol.a.NativeProtocol#sendCommand

public final NativePacketPayload sendCommand(Message queryPacket, boolean skipCheck, int timeoutMillis) {//发送心跳包,debug得知发送的十六进制0x0e,也就是数字14send(queryPacket, queryPacket.getPosition());}

总结

至此真相大白,因为配置了connectionTestQuery,所以没有使用jdbc的校验机制,修改方法就是去掉connectionTestQuery,jdbc的校验机制是在获取连接时,校验合法性,比定时校验效率要高;
另外,jdbc的校验相比上层库校验效率更高,因为是tcp层的心跳包而不是mysql引擎解析的sql语句,所以druid、hikari层的校验可以去掉了。

个人公众号

springboot hikari数据库连接池死链 出现异常相关推荐

  1. SpringBoot的数据库连接池

    一.前言 开发web项目,我们肯定会和数据库打交道,因此就会涉及到数据库链接的问题.在以前我们开发传统的SSM结构的项目时进行数据库链接都是通过JDBC进行数据链接,我们每和数据库打一次交道都需要先获 ...

  2. springboot+dbcp数据库连接池

    springboot+dbcp数据库连接池 1,连接池配置文件 2,连接工具类 3,测试类测试连接 4,实际调用连接去同步数据 1,连接池配置文件 在resources目录下添加文件dbcp.prop ...

  3. springboot配置数据库连接池hikari

    Springboot2.0以后默认数据库连接池选择了Hikari(性能高)开源地址:https://github.com/brettwooldridge/HikariCP 里面有技术文档 性能方面 h ...

  4. SpringBoot默认数据库连接池Hikari

    Hikari是一款非常强大,高效,并且号称"史上最快连接池".由于其性能方面比较好,并且在springboot2.0之后,采用的默认数据库连接池就是Hikari,在引用parent ...

  5. hikaripool连接保持_springboot2的hikari数据库连接池默认配置

    序 Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了hikari,这里主要研究下hikari的默认配置 spring-configuration ...

  6. SpringBoot 默认数据库连接池 HikariCP

    目录 引言 1.问题描述 2.SpringBoot默认的数据库连接池 3.HikariCP是什么 4.测试依赖 5.配置文件 5.1.数据库连接参数 5.2.连接池数据基本参数 5.3.连接检查参数 ...

  7. SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)

    作者:大三的土狗 专栏:SpringBoot入门到精通 快速导航 前言 1.连接池介绍 2.HicariCP 1)导入坐标 2)修改配置 3)优势 3.Druid 1)导入坐标 2)修改配置 3)优势 ...

  8. springboot 查看数据库连接池

    在 src/test 下查看 我查看的是 springboot的默认连接池 @SpringBootTest class SpringbootMybatisApplicationTests {//spr ...

  9. Hikari数据库连接池

    demo测试 import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import j ...

  10. Springboot整合Hikari数据库连接池,密码加密

    1.application.yml配置 1 spring: 2 datasource: 3 jdbcUrl: jdbc:mysql://127.0.0.1:3306/jby?serverTimezon ...

最新文章

  1. 启动webpack-dev-server只能本机访问的解决办法
  2. ML之SSIM:基于输入图片RGB的三维向量利用SSIM(结构相似性度量)算法进行判别
  3. MySQL不使用逗号_Mysql 不能使用逗号的情况
  4. 英特尔物联网产业的布局中,优势和劣势都在哪?
  5. php time()为空_PHP time()用法及代码示例
  6. CF 1642 F. Two Arrays 随机 + sosdp
  7. 三、面向对象——9-初始化块
  8. android edittext不可复制_Android中使EditText只读的方法(可恢复编辑状态)
  9. apache ignite系列(九):ignite调优
  10. mysql linux 关闭防火墙_linux常用命令和关闭防火墙
  11. 【报告分享】汽车行业“无接触”营销风险初探.pdf(附下载链接)
  12. 洛谷P1461 海明码 Hamming Codes
  13. TransCoder介绍
  14. 【DSP】CCS 5.5的安装教程
  15. MyEclipse配置Tomcat7
  16. VS2017安装教程
  17. AD里面简易的3d制作
  18. Springboot Failed to parse configuration class [x]
  19. “黑球”行动再升级,SMBGhost漏洞攻击进入实战
  20. c语言编程函数名:b开头

热门文章

  1. 边缘云计算概念、架构及应用场景
  2. 中科大自主招生2018年笔试数学
  3. 如何打印网上的文章资料,网上文章怎么打印
  4. 收录国外造船信息-Pursuit of a product work breakdown structure (PWBS)
  5. MySQL使用JDBC高级操作和事务
  6. 天朝有一个乞丐姓洪,去天桥要钱 第一天要了1块钱 第二天要了2块钱 第三天要了4块钱 第四天要了8块钱 以此类推 问题: 洪乞丐干10天,收入是多少?
  7. msrcr图像增强算法 matlab,图像处理之Retinex增强算法(SSR、MSR、MSRCR)
  8. 从零搭建自动化测试平台
  9. 精力管理指南:想要每天精力充沛,只需做好这 3 点
  10. 家用汽车蓄电池亏电解决方案