数据源创建失败后,后台CreateConnectionThread线程不断报错,即时设置了connectionErrorRetryAttempts也不起作用。建议超过失败重试次数后就终止该线程。
原提问者GitHub用户gooree
在使用数据库连接池时,如果数据源创建失败,建议终止CreateConnectionThread线程,以免线程一直运行导致资源浪费和性能下降。
CreateConnectionThread是Druid连接池中的一个线程,它负责创建连接并将连接加入连接池。如果数据源创建失败,连接池无法正常工作,CreateConnectionThread线程将一直处于运行状态,占用系统资源。
为了解决这个问题,可以在数据源创建失败后,调用DruidDataSource的close()方法来关闭连接池,并终止CreateConnectionThread线程。例如:
Copy
try {
// 创建数据源
DruidDataSource dataSource = new DruidDataSource();
// 设置连接池配置
// ...
dataSource.init();
} catch (Exception e) {
// 数据源创建失败,关闭连接池
dataSource.close();
}
在这个示例中,如果数据源创建失败,就会调用dataSource.close()方法来关闭连接池。在关闭连接池的过程中,CreateConnectionThread线程也会被终止,从而释放系统资源。
当数据源创建失败后,如果后台的CreateConnectionThread线程不断报错且无法通过设置connectionErrorRetryAttempts生效,终止该线程是一种合理的做法。这可以防止不必要的重试和错误日志的积累。
在终止CreateConnectionThread线程之前,你可以考虑添加一些条件判断,以避免过早地终止线程。例如,你可以检查失败次数是否超过一定阈值,或者在达到失败次数后增加一段延迟时间再终止线程,以确保有足够的时间处理其他可能的操作。
具体的实现方法可能因你的代码结构和业务逻辑而有所不同,你可能需要进行适当的修改。请确保在终止线程前,首先考虑线程的安全退出和释放资源,以避免可能的问题。
另外,建议你仔细检查报错日志和数据源创建的相关代码,以确认错误原因并尽可能修复问题。如果问题仍然存在,可以考虑向Druid的开发团队或社区反馈该问题,以获取更准确的解决方案和支持。
DruidDataSource源码1973行开始,CreateConnectionThread函数里面。errorCount>connectionErrorRetryAttempts条件不成立,会一直出现打印日志的情况。如果breakAfterAcquireFailure设置为true,就会停止
if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) {
if (breakAfterAcquireFailure) {
break;
}
try {
Thread.sleep(timeBetweenConnectErrorMillis);
} catch (InterruptedException interruptEx) {
break;
}
}
原回答者GitHub用户zhangjianweibj
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。