Druid 连接池提供了多种连接测试策略,用于确保连接的有效性和可用性。这些策略可以帮助你在应用程序启动时和运行时检测和维护连接池中的连接。以下是 Druid 连接池中常见的连接测试策略:
1. 初始化时测试连接(testOnBorrow
)
这是最常用的测试策略之一,它会在从连接池中借出连接之前测试连接的有效性。这可以确保应用程序每次获取到的都是一个可用的连接。
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery("SELECT 1");
2. 归还时测试连接(testOnReturn
)
这种策略会在连接归还到连接池之前对其进行测试。如果测试失败,连接将不会被归还到池中。
dataSource.setTestOnReturn(true);
dataSource.setValidationQuery("SELECT 1");
3. 启动时测试连接(testWhileIdle
)
这种策略会在连接空闲时定期测试连接的有效性。这对于长时间未使用的连接特别有用,可以确保这些连接仍然有效。
dataSource.setTestWhileIdle(true);
dataSource.setValidationQuery("SELECT 1");
4. 定期测试连接
可以在固定的时间间隔内测试连接的有效性。这种策略可以通过设置 timeBetweenEvictionRunsMillis
和 minEvictableIdleTimeMillis
属性来实现。
dataSource.setTimeBetweenEvictionRunsMillis(60000); // 每隔一分钟执行一次驱逐线程
dataSource.setMinEvictableIdleTimeMillis(300000); // 至少空闲五分钟才能驱逐
dataSource.setTestWhileIdle(true);
dataSource.setValidationQuery("SELECT 1");
5. 连接超时时测试连接
当连接超过一定时间未被使用时,可以自动测试其有效性。
dataSource.setMinEvictableIdleTimeMillis(300000); // 至少空闲五分钟才能驱逐
dataSource.setTestWhileIdle(true);
dataSource.setValidationQuery("SELECT 1");
6. 自定义测试策略
除了上述内置的测试策略外,还可以通过自定义逻辑来实现更为复杂的测试策略。例如,可以编写自定义的 Filter 来实现在特定条件下测试连接。
7. 验证查询(validationQuery
)
用于测试连接的 SQL 查询。通常选择一个执行速度快且不会对数据库造成影响的简单查询。
dataSource.setValidationQuery("SELECT 1");
8. 测试失败重试次数(validationQueryTimeoutRetryCount
)
当验证查询失败时,可以设置重试次数。
dataSource.setValidationQueryTimeoutRetryCount(3); // 最多重试三次
9. 快速失败(fastFailValidation
)
如果设置了 fastFailValidation
为 true
,那么一旦发现无效连接,就会立即停止验证并抛出异常。
dataSource.setFastFailValidation(true);
10. 连接有效性检查
可以配置连接有效性检查线程的执行间隔时间,以便定期检查连接的有效性。
dataSource.setTimeBetweenEvictionRunsMillis(60000); // 每隔一分钟执行一次驱逐线程
11. 连接超时时间(maxWait
)
当连接池中的可用连接数达到上限时,等待获取连接的超时时间。
dataSource.setMaxWait(60000); // 等待时间不超过一分钟
通过上述策略,可以确保 Druid 连接池中的连接始终保持在健康状态,从而提高应用的稳定性和性能。在实际应用中,可以根据具体情况选择合适的测试策略组合。例如,在生产环境中,通常会启用 testWhileIdle
并设置合理的 timeBetweenEvictionRunsMillis
和 minEvictableIdleTimeMillis
,以确保连接池中的连接始终处于活跃状态。