(亲测有效)Springboot数据库连接池超时报错的解决办法

使用springboot 线程池连接MySQL时,mysql数据库wait_timeout 为8个小时,所以程序第二天发现报错,在url配置了 autoReconnect=true 也不行,这个异常通常在Linux服务器上会发生,原因是Linux系统会主动断开一个长时间没有通信的连接

问题在于数据库连接池长时间处于间歇状态,导致Linux系统将其断开了,然后抛出了这个错误。

要想解决这个问题,就要主动让我们的连接池保持连接,不被断开。处理方式很简单,只需要加入相关配置即可。

打开application.properties文件,加入下面配置:

spring.datasource.testOnBorrow=true

spring.datasource.validationQuery=SELECT 1

第一句的意思是:自动重连

第二句的意思是:验证连接的sql语句

Spring Boot项目中使用Druid连接池时,如果数据库服务重启导致连接池中的连接失效,可以采取以下步骤来解决无法连接的问题: 1. **配置自动刷新连接**:Druid默认支持连接池的自动检和刷新功能。在application.yml或application.properties文件中添加以下配置: ```yaml druid: pool: testWhileIdle: true # 连接空闲时进行检 testOnBorrow: false # 检只在借出连接时进行 testOnReturn: false # 归还连接时检 timeBetweenEvictionRunsMillis: 60000 # 设置检查周期,单位毫秒 maxActive: 50 # 设置最大活动连接数 ``` 2. **设置合理超时时间**:配置`maxWait`属性,当所有连接都忙时,连接请求会等待一段时间,超过这个时间报错: ```yaml druid: pool: maxWait: 60000 # 等待的最大毫秒数,防止因为长时间等待导致资源耗尽 ``` 3. **监控和日志记录**:启用Druid的监控页面,查看连接池状态和错误信息,以便及时发现并解决问题。同时,在日志中添加异常处理,记录详细的启动期间的数据库连接情况。 4. **重启应用时清理连接**:如果你使用Spring Boot Actuator的Health检查API,可以在启动时检查数据源健康状况,若不健康,手动关闭连接池,然后重新初始化: ```java @PostConstruct public void initDatabasePool() { if (health().database().isDown()) { dataSource.getConnection().close(); // 或者其他关闭连接池的方式 dataSource.init(); // 初始化连接池 } } ``` 5. **配置心跳检**:通过设置心跳检机制,Druid会在一定时间内发送SQL给数据库来判断其是否存活。配置如下: ```yaml druid: monitor: dbMonitorEnable: true sqlCheckEnabled: true ``` 如果以上步骤都做了还是出现问题,可能是数据库配置本身出现了问题,需要检查数据库的监听地址、端口等是否正确。此外,确认数据库服务是否已成功启动并且监听到连接请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值