之前单数据源的时候没有出现过这样的问题,也没有配置test-while-idle=true这一类的参数。配置如下
切换成多数据源之后
就开始出现No operations allowed after connection closed.
网上搜索是要加上mybatis的相关的配置
请问是加上这些就能好使吗? 那为什么单数据源的时候不用加呢?
之前单数据源的时候没有出现过这样的问题,也没有配置test-while-idle=true这一类的参数。配置如下
切换成多数据源之后
就开始出现No operations allowed after connection closed.
网上搜索是要加上mybatis的相关的配置
请问是加上这些就能好使吗? 那为什么单数据源的时候不用加呢?
是的,添加testWhileIdle等配置可以解决这个问题。核心原因是多数据源场景下的连接池生命周期管理差异:
建议配置示例:
# 数据源1
spring.datasource.druid.one.test-while-idle=true
spring.datasource.druid.one.validation-query=SELECT 1
spring.datasource.druid.one.time-between-eviction-runs-millis=60000
# 数据源2
spring.datasource.druid.two.test-while-idle=true
spring.datasource.druid.two.validation-query=SELECT 1
spring.datasource.druid.two.time-between-eviction-runs-millis=60000
注意需要同时配置三个参数才会生效:
该现象的本质是:当使用多数据源时,连接池的空闲连接被数据库主动断开(如MySQL的wait_timeout),而连接池未能及时检测到连接失效。单数据源场景下Spring Boot的自动配置会帮我们设置合理的默认值,但多数据源时需要手动补全这些配置。
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
是的,添加图片中展示的配置通常能解决这个问题,特别是这些关键参数:
对每个数据源都需要类似配置:
配置说明
test-while-idle=true:
validation-query:
time-between-eviction-runs-millis:
min-idle 和 max-idle:
为什么需要这些配置
多数据源环境下,某些数据源可能较少使用,导致连接长时间空闲。数据库服务器通常会关闭长时间空闲的连接(如MySQL默认8小时)。如果应用尝试使用这些已关闭的连接,就会出现"No operations allowed after connection closed"错误。
通过启用
test-while-idle
和设置validation-query
,连接池会定期验证连接是否有效,及时关闭无效连接并创建新连接,从而避免使用已关闭的连接。