Druid 连接池提供了多种机制来确保连接的有效性,从而提高应用程序的稳定性和性能。以下是 Druid 连接池中常用的连接有效性检测机制:
1. 验证查询 (Validation Query)
- 配置项:
validationQuery
- 作用:通过执行一个简单的 SQL 查询来验证连接是否有效。如果查询成功执行且返回预期的结果,则认为连接有效。
- 示例配置:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"> <property name="url" value="jdbc:mysql://localhost:3306/yourdatabase"/> <property name="username" value="yourusername"/> <property name="password" value="yourpassword"/> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="validationQuery" value="SELECT 1"/> <!-- 验证查询 --> <property name="testWhileIdle" value="true"/> <!-- 在空闲时测试连接 --> <property name="testOnBorrow" value="false"/> <!-- 借用连接时不测试 --> <property name="testOnReturn" value="false"/> <!-- 返回连接时不测试 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 连接有效性检查间隔时间 --> </bean>
2. 连接有效性检查间隔时间
- 配置项:
timeBetweenEvictionRunsMillis
- 作用:设置检查连接有效性的周期。Druid 会每隔一段时间执行一次验证查询,以确保连接池中的连接都是有效的。
- 示例配置:
<property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 间隔 60 秒检查一次 -->
3. 在空闲时测试连接
- 配置项:
testWhileIdle
- 作用:当连接空闲时,进行有效性检查。这有助于及早发现并处理无效连接。
- 示例配置:
<property name="testWhileIdle" value="true"/>
4. 借用连接时测试连接
- 配置项:
testOnBorrow
- 作用:在从连接池中借用连接时进行有效性检查。这确保了每次应用程序获取到的连接都是有效的。
- 示例配置:
<property name="testOnBorrow" value="true"/>
5. 返回连接时测试连接
- 配置项:
testOnReturn
- 作用:在连接返回到连接池时进行有效性检查。这有助于及时发现连接问题,并避免无效连接进入连接池。
- 示例配置:
<property name="testOnReturn" value="true"/>
6. 最小空闲时间
- 配置项:
minEvictableIdleTimeMillis
- 作用:设置连接被认为可疑的最小空闲时间。如果连接空闲时间超过了这个值,那么该连接将被标记为可疑,并进行有效性检查。
- 示例配置:
<property name="minEvictableIdleTimeMillis" value="300000"/> <!-- 5分钟 -->
7. 连接泄漏检测
- 配置项:
removeAbandoned
,removeAbandonedTimeout
- 作用:启用连接泄漏检测功能,如果连接在指定时间内未被归还到连接池,则认为发生了连接泄漏,并自动关闭这些连接。
- 示例配置:
<property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="300"/> <!-- 5分钟内未归还则关闭 -->
8. 配置连接超时时间
- 配置项:
maxWait
- 作用:设置从连接池获取连接的最大等待时间。如果超过这个时间仍然无法获取到连接,则抛出异常。
- 示例配置:
<property name="maxWait" value="3000"/> <!-- 3秒 -->
通过这些配置,Druid 连接池可以有效地检测连接的有效性,确保连接池中的连接始终保持健康状态。这样可以避免应用程序使用无效连接导致的问题,提高系统的稳定性和性能。请注意,这些配置需要根据具体的应用场景和需求进行调整,以达到最佳效果。