第七章、testWhileIdle、testOnBorrow、testOnReturn 在探活的应用

本文详细探讨了Java连接池中testWhileIdle、testOnBorrow和testOnReturn三个关键配置参数的作用,它们确保在借用、归还和空闲期间对数据库连接进行健康检查,以保证应用的稳定性和数据安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

testOnBorrow 申请连接时执行validationQuery 配置的探活语句检测连接是否有效。
testWhileIdle 申请连接的时候检测,如果空闲时间于timeBetweenEvictionRunsMillis ,执 validationQuery 检测连接是否有效
testOnReturn 归还连接时执 validationQuery 检测连接是否有效。
timeBetweenEvictionRunsMillis testWhileIdle 的判断依据

testOnBorrow 和 testWhileIdle

com.alibaba.druid.pool.DruidDataSource#getConnectionDirect

// 获取连接时检测连接有效性
if (testOnBorrow) {
   
   
    // 连接检测
    boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
    if (!validate) {
   
   
        if (LOG.isDebugEnabled()) {
   
   
            LOG.debug("skip not validate connection.");
        }
        discardConnection(poolableConnection.holder);
        continue;
    }
} else {
   
   
    // 因为没有做连接检测,需要判断一下
    if (poolableConnection.conn.isClosed()) {
   
   
        discardConnection(poolableConnection.holder); // 传入null,避免重复关闭
        continue;
    }
    // testOnBorrow为false 是testWhileIdle的前提
    if (testWhileIdle) {
   
   
        final DruidConnectionHolder holder = poolableConnection.holder;
        //  当前时间
        long currentTimeMillis = System.currentTimeMillis();
        // 上一次连接活跃时间
        long lastActiveTimeMillis = holder.lastActiveTimeMillis;
        
Properties检查语法:server.port=9012 spring.application.name=saas-base # logback logging.config=classpath:saas-logback.xml logPath=/app/lds-pxp/${spring.application.name}/logs logging.maxHistory=30 #\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3,\u96C6\u7FA4\u591A\u4E2A\u6709\u9017\u53F7\u5206\u5272 spring.profiles.active=prod spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848 spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr} spring.main.allow-bean-definition-overriding=true #spring.cloud.nacos.config.file-extension=properties #spring.cloud.nacos.config.shared-configs[0]=application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} spring.redis.host=192.168.88.130 spring.redis.port=6379 spring.redis.password=123456 spring.redis.database=15 spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.loginUsername=admin spring.datasource.druid.stat-view-servlet.loginPassword=123456 spring.datasource.dynamic.druid.initial-size=5 spring.datasource.dynamic.druid.min-idle=5 spring.datasource.dynamic.druid.maxActive=20 spring.datasource.dynamic.druid.maxWait=60000 spring.datasource.dynamic.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.dynamic.druid.minEvictableIdleTimeMillis=300000 spring.datasource.dynamic.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.dynamic.druid.testWhileIdle=true spring.datasource.dynamic.druid.testOnBorrow=false spring.datasource.dynamic.druid.testOnReturn=false spring.datasource.dynamic.druid.poolPreparedStatements=true spring.datasource.dynamic.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.dynamic.druid.filters=stat,slf4j spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico
最新发布
04-01
<think>好的,我现在需要帮助用户检查他们提供的配置文件中的语法问题。首先,我得仔细阅读用户提供的配置内容,逐行检查是否有明显的语法错误或配置错误。 首先,用户给出的配置看起来像是一个Spring Boot应用的配置文件,可能是application.properties或类似的。常见的配置项包括服务器端口、应用名称、日志设置、Nacos服务发现、Redis和数据库连接等。 让我从第一个部分开始检查: 1. `server.port=9012`:这个看起来没问题,指定了端口号,没有语法问题。 2. `spring.application.name=saas-base`:应用名称配置正确。 3. 注释`# logback`,没问题。 4. `logging.config=classpath:saas-logback.xml`:指定日志配置文件,路径正确。 5. `logPath=/app/lds-pxp/${spring.application.name}/logs`:这里使用了属性占位符,应该没问题,但需要注意实际路径是否存在,不过语法上是对的。 6. `logging.maxHistory=30`:日志保留天数,正确。 接下来是服务注册中心的配置: 7. `spring.profiles.active=prod`:激prod环境,正确。 8. `spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848`:Nacos服务发现的地址,端口是9848,需要注意Nacos的默认端口是8848,用户可能在这里写错了。9848是用于gRPC的端口,而通常服务发现使用8848,这可能是一个潜在的问题点。 9. `spring.cloud.nacos.config.server-addr=${...}`:引用了上面的地址,同样需要注意端口是否正确。 10. `spring.main.allow-bean-definition-overriding=true`:允许Bean覆盖,语法正确。 接下来是Redis配置: 11. `spring.redis.host=192.168.88.130`:正确。 12. `spring.redis.port=6379`:正确。 13. `spring.redis.password=123456`:正确。 14. `spring.redis.database=15`:正确,但需要确认数据库是否存在。 数据库连接池的配置部分: 15. `spring.datasource.druid.stat-view-servlet.enabled=true`:正确。 16. `spring.datasource.druid.stat-view-servlet.loginUsername=admin`:正确。 17. `spring.datasource.druid.stat-view-servlet.loginPassword=123456`:正确。 18. `spring.datasource.dynamic.druid.initial-size=5`:动态数据源配置,注意这里可能属于动态数据源插件(如dynamic-datasource-spring-boot-starter),配置项是否正确。例如,`initial-size`是否是Druid的正确属性,或者是否应该放在`spring.datasource.druid`下。这里用户可能混淆了动态数据源和Druid的配置层级。正确的路径可能应该是`spring.datasource.dynamic.druid.initial-size`,如果该starter支持这样的配置,那没问题,否则可能需要调整。 19. 类似的,后续的`min-idle`, `maxActive`等属性,同样需要确认配置路径是否正确。 20. `spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver`:正确。 21. `spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico`:这里发现URL不完整,`useUnico`应该是`useUnicode=true&characterEncoding=utf8`之类的,存在拼写错误或者未完成的情况。这是明显的语法问题,导致配置不完整,应用启动时可能会报错。 接下来,用户提供的配置在最后一行突然结束,可能是在复制时遗漏了后面的内容,比如`useUnicode`的参数和后续的其他配置项,如用户名和密码是否缺失。例如,通常数据库URL还会包括其他参数,并且应该有`username`和`password`的设置,但在用户的配置中没有看到,这可能是一个大问题。 此外,检查是否有未闭合的引号或特殊字符未转义。例如,在`connectionProperties`中使用了`\=`来转义等号,这在属性文件中是正确的,因为等号不需要转义,但用户可能想表达的是属性中的等号,这里是否正确?例如`druid.stat.mergeSql=true`,实际上应该使用`druid.stat.mergeSql=true`,不需要转义,但用户写成了`druid.stat.mergeSql\=true`,这里的反斜杠可能导致解析错误,因为属性文件中键值对是用等号分隔的,如果键中包含等号,可能需要转义,但Druid的配置中应该直接写值部分,所以这里的转义符可能多余,导致配置错误。 总结可能的问题点: 1. Nacos的server-addr端口可能是错误的,应该检查是否为8848。 2. 数据库URL不完整,`useUnico`后面缺少内容,需要补充完整。 3. 动态数据源配置项是否正确,比如`spring.datasource.dynamic.druid`是否是正确的配置前缀,还是应该放在`spring.datasource.druid`下。 4. 检查`connectionProperties`中的转义符是否正确。 5. 确保数据库配置的username和password是否存在,用户提供的配置中似乎缺失了这些关键信息,比如`spring.datasource.dynamic.datasource.master.username`和`password`。 现在,我需要将这些潜在的问题整理出来,用清晰的结构告诉用户,并指出如何修正。特别是数据库URL不完整和缺失的数据库凭证,这会导致应用无法启动,需要优先处理。另外,Nacos的端口问题也需确认。</think>以下是对配置文件的语法检查及问题分析,按优先级排序: --- ### **1. 严重错误:数据库连接URL不完整** ```properties spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico ``` - **问题**:URL 参数 `useUnico` 未完整,应为 `useUnicode=true&characterEncoding=utf-8`。 - **修复**: ```properties spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnicode=true&characterEncoding=utf8 ``` --- ### **2. 缺失关键配置项:数据库用户名和密码** - **问题**:未配置数据库的用户名和密码,导致连接失败。 - **修复**:补充以下配置: ```properties spring.datasource.dynamic.datasource.master.username=您的数据库用户名 spring.datasource.dynamic.datasource.master.password=您的数据库密码 ``` --- ### **3. 潜在配置问题:Nacos 服务端口** ```properties spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848 ``` - **问题**:Nacos 默认服务端口为 `8848`,`9848` 是 gRPC 端口(仅用于 2.x 版本客户端通信)。 - **建议**: - 若使用 Nacos 1.x,端口应改为 `8848`。 - 若使用 Nacos 2.x 且启用了 gRPC,需同时开放 `9848` 和 `8848` 端口。 --- ### **4. 转义符问题:Druid 连接属性** ```properties spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 ``` - **问题**:属性文件中的等号 `=` 无需转义,反斜杠 `\` 会导致解析错误。 - **修复**: ```properties spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` --- ### **5. 动态数据源配置层级问题** 配置项前缀为 `spring.datasource.dynamic.druid`,但通常 Druid 配置应位于 `spring.datasource.druid`。需确认是否使用了动态数据源插件(如 `dynamic-datasource-spring-boot-starter`),其配置规范为: ```properties # 动态数据源配置示例 spring.datasource.dynamic.datasource.master.driver-class-name=... spring.datasource.dynamic.datasource.master.url=... spring.datasource.dynamic.druid.initial-size=5 # 此处配置可能无效 ``` - **建议**:将 Druid 通用配置移至 `spring.datasource.druid`,例如: ```properties spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 ``` --- ### **其他注意事项** 1. **日志路径权限**:确保 `/app/lds-pxp/...` 目录存在且应用有写入权限。 2. **Redis 数据库验证**:确认 Redis 的 `database=15` 是否存在。 3. **Nacos 配置中心**:检查注释掉的 `spring.cloud.nacos.config.shared-configs` 是否需要启用。 --- **总结建议**:优先修复数据库 URL 和补充用户名密码,其次检查 Nacos 端口及 Druid 配置层级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值