数据库服务故障期间,启动使用druid库的server,可能存在线程资源泄漏隐患。
常见问题中,有提到
如果DruidDataSource在init的时候失败了,不再使用,是否需要close 是的,如果DruidDataSource不再使用,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。 是不是在lib中做一些防御比较好?
另外:DruidDataSource的init方法打印的log与init的结果并不完全一致。如:init过程抛异常,finally仍打印初始化成功。
原提问者GitHub用户qudongfang
数据库服务故障期间,如果使用Druid库的DataSource启动失败,可能会导致线程资源泄漏的隐患。这是因为在DruidDataSource初始化过程中,会启动一些线程用于创建和销毁连接,如果初始化失败但未及时关闭这些线程,可能会导致线程资源泄漏的问题。
为了避免这种情况的发生,建议在使用DruidDataSource时,根据实际情况调用其相应的方法来释放资源
是的,如果DruidDataSource不再使用,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。另外,DruidDataSource的init方法打印的log与init的结果并不完全一致,这可能是由于DruidDataSource的初始化过程中存在一些异常情况,例如连接池配置不正确、数据库连接失效等。
新版本新增加asyncInit配置,看是否能解决你的问题
https://github.com/alibaba/druid/releases/tag/1.1.4
原回答者GitHub用户wenshao
是的,如果在初始化DruidDataSource时发生了错误并且不再使用该数据源对象,那么应该调用close
方法来释放资源。这将关闭Create和Destroy线程,并释放与数据源相关的其他资源。建议在代码中做一些防御措施,确保在错误发生后及时调用close
方法。
关于init方法打印的日志和实际初始化结果不完全一致的问题,这可能是由于异常处理机制导致的。即使在init过程中抛出了异常,finally
块仍然会执行,并打印初始化成功的日志。这是因为finally
块中的代码总是会被执行,无论是否有异常发生。所以,在日志中看到初始化成功的信息并不代表实际上初始化操作成功。为了更准确地反映初始化的结果,建议在代码中根据实际情况进行异常捕获和处理,并相应地记录日志。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。