springboot中JDBC连接超时问题

最近项目中有一个问题,电子保卡信息要写入数据库,但写入失败,报错

息是这样的:

The last packet successfully received from the server was 57,704,088 
milliseconds ago. The last packet sent successfully to the server was 
57,704,089 milliseconds ago. is longer than the server configured 
value of ‘wait_timeout’. You should consider either expiring and/or 
testing connection validity before use in your application, increasing 
the server configured values for client timeouts, or using the 
Connector/J connection property ‘autoReconnect=true’ to avoid this 
problem.

大体意思是上次成功接收报文的时间超过了数据库超时时间的值,为了解决这个问题,应当增加数据库的超时时间或者是启用数据库自动重连机制。所以我们可以用两种方法: 
1、从DB层解决问题:增大数据库连接超时时间 
2、从应用层解决问题:设置自动重连机制,即在一定时间之内与数据库重连一次

1 增大数据库连接超时时间


数据库的超时时间是指一个连接可空闲的最大时间,如超时时间是30分钟,则如果一个连接空闲了30分钟,那么该连接将断开。

我这里是MySql数据库,首先使用下面命令查询数据库超时时间大小:

SHOW  GLOBAL  VARIABLES LIKE  'wait_timeout';

显示结果如下:

这个是MySql设置的默认值,这里单位是秒,28800秒就是8小时。

想要重新设置超时时间可以用以下命令:

SET GLOBAL wait_timeout=28800;


但是数据库的连接超时时间不能设置太长,时间过长,导致过多的connection Sleep,占用较多系统资源。所以理论上虽然可以将超时时间设置的更大,但强列不推荐用这种方法。看一下第二种办法。

2 启用自动重连机制

需要对application.properties的datasource进行配置。我使用是mybatis连接数据库。

配置及具体含义

#初始化连接
spring.datasource.initial-size=10
#最大空闲连接
spring.datasource.max-idle=20
#最小空闲连接
spring.datasource.min-idle=5
#最大连接数量
spring.datasource.max-active=50
#是否在自动回收超时连接的时候打印连接的超时错误
spring.datasource.log-abandoned=true
#是否自动回收超时连接
spring.datasource.remove-abandoned=true
#超时时间(以秒数为单位)
spring.datasource.remove-abandoned-timeout=180
##<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
spring.datasource.max-wait=1000
spring.datasource.test-while-idle=true
#检测数据库的查询语句
spring.datasource.validation-query=select 1 from dual
spring.datasource.test-on-borrow=true
#每隔五分钟检测空闲超过10分钟的连接
spring.datasource.min-evictable-idle-time-millis=600000
spring.datasource.time-between-eviction-runs-millis=300000

 

### Spring Boot 应用中 MySQL 数据库连接超时解决方案 在处理 Spring Boot 应用中的 MySQL 连接超时时,可以采取多种措施来优化配置并解决问题。 #### 配置数据源属性 调整 `application.properties` 或者 `application.yml` 文件中的数据源属性能够有效缓解连接超时现象。对于 HikariCP(默认的数据源),以下是几个重要的参数设置: - **最大活跃连接数 (`maximumPoolSize`)** 设置合理的最大连接数量有助于防止过多请求耗尽资源。通常建议根据应用程序的工作负载进行适当调整[^1]。 - **最小闲置连接数 (`minimumIdle`)** 维持一定量的空闲连接可以在高峰期快速响应新的数据库操作需求。 - **连接超时时间 (`connectionTimeout`)** 定义获取连接的最大等待毫秒数。如果超过这个时限仍未获得可用连接,则抛出异常。增加此值可能暂时掩盖问题所在,但并非长久之计;更应该关注为何频繁发生超时事件。 ```properties spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000 ``` #### 使用 PooledConnection 获取实际物理连接 有时为了诊断或特殊用途,开发者可能会尝试通过 JDBC API 的方式直接访问底层的实际物理连接对象。然而,在大多数情况下并不推荐这样做,因为这会绕过连接池管理机制,可能导致不可预见的行为和性能下降。正确做法应当依赖于框架所提供的接口来进行数据库交互。 ```java // 不推荐的做法 Connection con = dataSource.getConnection(); Connection actual = ((javax.sql.PooledConnection) con).getConnection(); // 推荐的方式是仅使用由DataSource提供的标准JDBC Connection实例 try (Connection conn = dataSource.getConnection()) { // 执行SQL语句... } ``` #### 修改表结构字段类型 当遇到权限认证失败等问题时,检查 SQL 创建脚本以及相应的 DDL 可能会有帮助。例如,将某些列的数据类型从 `DATETIME` 改为 `TIMESTAMP` 并移除不必要的默认值定义可以帮助解决特定场景下的兼容性和安全问题[^2]。 ```sql ALTER TABLE your_table MODIFY COLUMN created_at TIMESTAMP; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值