数据库连接引发quartz日志打爆磁盘
问题描述
quartz不断的获取数据库连接,每次获取失败的连接会打印出error日志,由于quartz没有等待机制,因此日志打印非常快,很快就打满的磁盘空间,导致系统出现io无法读写,引发整个系统无法继续运行。引发原因
数据库因为闪断或者连接池的连接长时间处于空闲状态后,数据库主动中断连接,quartz做调度的时候会从连接词中获取连接,当连接获取不到或者获取到一个无效连接后引发错误。解决方案
我们可以通过优化数据库连接池的配置来解决,可以从2个方面来解决该问题当程序获取数据库连接的时候判断连接是否有效,如果无效则把该连接从数据库连接池中取出,避免下次再取仍然获取到无效连接的情况。
启动线程池检查任务,定时检查已过期的连接,从连接池中回收,让连接池从新创建新的连接。
以DBCP为例
testOnBorrow=true表示为如果获取到无效连接,则重新获取连接直到获取到正常连接,注意验证连接也要看系统情况而定开启会到系统并发能力有很大影响。
testWhileIdle=ture开启有效性检测线程,去检测是否存在过期连接,如果有过期连接则把该连接从连接池中去除。
如果testWhileIdle=ture,以timeBetweenEvictionRunsMillis配置为线程检测的周期,比如以上周期为60秒检测一次。
minEvictableIdleTimeMillis为如果发现连接池中连接的有效期超过该有效期,则认为该连接已过期,可以进行回收。
通过以上配置,我们可以从侧面解决quartz不断打印错误日志的情况,因为连接可以由连接池自动恢复。