数据库宕机后重启,druid连接池不能自动恢复正常。日志总是包连接不上数据库,但是重启应用,druid立即恢复正常使用!
这是什么情况呢?
数据库宕机后重启,druid连接池不能自动恢复正常。日志总是包连接不上数据库,但是重启应用,druid立即恢复正常使用!
这是什么情况呢?
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
Druid连接池在数据库宕机后无法自动恢复的原因可能与BreakAfterAcquireFailure属性设置、连接池的自动重连机制以及相关的配置项有关。解决此问题可以从以下几个方面着手:
BreakAfterAcquireFailure属性设置:当BreakAfterAcquireFailure设置为true时,如果请求连接失败,Druid不会尝试重连,而是拒绝客户端的请求。这可能导致即使数据库重启后,Druid也无法恢复正常工作。建议将BreakAfterAcquireFailure设置为false,以允许Druid在数据库可用时自动重连。
创建连接线程的状态检测:当BreakAfterAcquireFailure为true时,如果多次重试后仍无法获取连接,CreateConnectionThread线程可能会终止。因此,需要在每次获取连接时检查CreateConnectionThread线程的状态,如果发现线程已终止,则应关闭并重新创建连接池。
调整重试次数和间隔:为了避免因频繁重连导致的内存溢出问题,可以调整连接错误时的重试次数(connection-error-retry-attempts)和重试间隔(timeBetweenEvictionRunsMillis),以控制连接池的行为。
合理配置连接池属性:除了上述属性外,还应确保其他连接池属性(如initialSize, minIdle, maxActive, maxWait等)根据实际应用场景进行合理配置,以确保连接池的稳定性和性能。
使用testWhileIdle和testOnBorrow:通过合理设置testWhileIdle和testOnBorrow属性,可以在空闲时或借用时检查数据库连接的有效性,从而保证从连接池中获取的连接是健康的。
应用层面的监控和干预:在应用层面实现对Druid连接池状态的监控,一旦检测到连接异常,可以通过应用逻辑来重置或重启连接池,以实现快速恢复。
考虑使用第三方监控工具:可以考虑使用如阿里云ARMS等第三方应用性能监控工具,这些工具可以提供实时的性能监控和故障排查,帮助及时发现和解决Druid连接池的问题。
综上所述,Druid连接池在数据库宕机后无法自动恢复的问题,通常可以通过调整Druid的配置来解决。同时,确保在实际部署中考虑到了所有相关的配置项,并进行充分的测试,以验证解决方案的有效性。在生产环境中,还应该实施适当的监控措施,以便在出现问题时能够迅速发现并采取行动。