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

当使用SpringBoot的线程池连接MySQL数据库时,由于wait_timeout设置,可能会遇到Linux系统在8小时后主动断开连接的问题。即使配置了url的autoReconnect=true,仍可能报错。为保持连接,可以在`application.properties`中添加配置:`spring.datasource.testOnBorrow=true`和`spring.datasource.validationQuery=SELECT 1`。这两个配置分别用于自动重连和验证连接有效性,从而避免因长时间无操作导致的连接断开。
部署运行你感兴趣的模型镜像

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

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

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

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

spring.datasource.testOnBorrow=true

spring.datasource.validationQuery=SELECT 1

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

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

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### Spring Boot 2.7.7 连接 SQL Server 数据库多次查询报错 'Connection reset' 的解决方案 在升级到 Spring Boot 2.7.7 后,如果遇到连接 SQL Server 数据库时多次查询报错 'Connection reset' 的问题,可能是由于以下原因导致:数据库连接池配置不当、网络问题或 JDBC 驱动版本不兼容。以下是针对该问题的详细分析和解决方案。 #### 数据库连接池配置优化 Spring Boot 2 默认使用 HikariCP 作为数据库连接池[^1]。HikariCP 是一个高性能的连接池,但其默认配置可能不适合所有场景。为了减少 'Connection reset' 错误的发生,可以调整 HikariCP 的相关参数: - **idleTimeout**: 设置空闲连接的最大存活时间。建议将其设置为与数据库服务器的超时时间一致。 - **maxLifetime**: 设置连接的最大存活时间。建议将其设置为小于数据库服务器的超时时间。 - **connectionTestQuery**: 设置用于试连接的 SQL 查询语句。对于 SQL Server,可以使用 `SELECT 1`。 - **poolName**: 为连接池指定一个唯一的名称,便于调试和监控。 示例配置如下: ```properties spring.datasource.hikari.idleTimeout=300000 spring.datasource.hikari.maxLifetime=600000 spring.datasource.hikari.connectionTestQuery=SELECT 1 spring.datasource.hikari.poolName=SQLServerPool ``` #### 网络问题排查 'Connection reset' 错误也可能由网络问题引起。确保以下条件满足: - 数据库服务器允许远程连接。 - 防火墙规则允许通过指定端口(如 1433)访问数据库。 - 使用稳定的网络环境进行连接。 #### JDBC 驱动版本兼容性 确保使用的 JDBC 驱动版本与 SQL Server 数据库版本兼容。对于 SQL Server 2019 或更高版本,推荐使用 Microsoft 提供的最新 JDBC 驱动版本。可以在 `pom.xml` 中添加以下依赖项: ```xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>11.2.1.jre17</version> </dependency> ``` 此外,可以通过在 JDBC URL 中添加参数来优化连接行为。例如,添加 `sendStringParametersAsUnicode=false` 和 `trustServerCertificate=true` 参数以提高兼容性和安全性[^2]。 示例 JDBC URL: ```plaintext jdbc:sqlserver://<server>:<port>;databaseName=<database>;sendStringParametersAsUnicode=false;trustServerCertificate=true ``` #### 自定义数据源配置 如果需要更灵活的数据源配置,可以参考以下代码示例。通过自定义 HikariConfig,确保所有 Hikari 相关的配置属性在应用启动时正确加载[^3]。 ```java @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariConfig hikariConfig() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:sqlserver://<server>:<port>;databaseName=<database>"); config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Properties prop = new Properties(); prop.setProperty("sendStringParametersAsUnicode", "false"); prop.setProperty("trustServerCertificate", "true"); config.setDataSourceProperties(prop); return config; } @Bean public DataSource dataSource(HikariConfig hikariConfig) { return new HikariDataSource(hikariConfig); } ``` #### 替换为 Druid 连接池 如果 HikariCP 无法满足需求,可以考虑使用 Alibaba 提供的 Druid 连接池。Druid 提供了强大的监控和扩展功能,适合复杂的应用场景[^4]。 添加 Maven 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> ``` 配置 Druid 数据源: ```properties spring.datasource.druid.url=jdbc:sqlserver://<server>:<port>;databaseName=<database> spring.datasource.druid.username=<username> spring.datasource.druid.password=<password> spring.datasource.druid.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 spring.datasource.druid.test-on-borrow=true spring.datasource.druid.validation-query=SELECT 1 ``` #### 总结 通过优化 HikariCP 配置、排查网络问题、确保 JDBC 驱动版本兼容性以及替换为 Druid 连接池,可以有效解决 Spring Boot 2.7.7 升级后连接 SQL Server 数据库多次查询报错 'Connection reset' 的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值