开发者社区> 问答> 正文

datasource存在资源泄漏隐患

数据库服务故障期间,启动使用druid库的server,可能存在线程资源泄漏隐患。

常见问题中,有提到

如果DruidDataSource在init的时候失败了,不再使用,是否需要close 是的,如果DruidDataSource不再使用,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。 是不是在lib中做一些防御比较好?

另外:DruidDataSource的init方法打印的log与init的结果并不完全一致。如:init过程抛异常,finally仍打印初始化成功。

原提问者GitHub用户qudongfang

展开
收起
山海行 2023-07-05 20:42:16 108 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    数据库服务故障期间,如果使用Druid库的DataSource启动失败,可能会导致线程资源泄漏的隐患。这是因为在DruidDataSource初始化过程中,会启动一些线程用于创建和销毁连接,如果初始化失败但未及时关闭这些线程,可能会导致线程资源泄漏的问题。

    为了避免这种情况的发生,建议在使用DruidDataSource时,根据实际情况调用其相应的方法来释放资源

    2023-07-30 13:36:35
    赞同 展开评论 打赏
  • 是的,如果DruidDataSource不再使用,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。另外,DruidDataSource的init方法打印的log与init的结果并不完全一致,这可能是由于DruidDataSource的初始化过程中存在一些异常情况,例如连接池配置不正确、数据库连接失效等。

    2023-07-11 10:15:02
    赞同 展开评论 打赏
  • 新版本新增加asyncInit配置,看是否能解决你的问题

    https://github.com/alibaba/druid/releases/tag/1.1.4

    原回答者GitHub用户wenshao

    2023-07-06 11:45:40
    赞同 展开评论 打赏
  • 是的,如果在初始化DruidDataSource时发生了错误并且不再使用该数据源对象,那么应该调用close方法来释放资源。这将关闭Create和Destroy线程,并释放与数据源相关的其他资源。建议在代码中做一些防御措施,确保在错误发生后及时调用close方法。

    关于init方法打印的日志和实际初始化结果不完全一致的问题,这可能是由于异常处理机制导致的。即使在init过程中抛出了异常,finally块仍然会执行,并打印初始化成功的日志。这是因为finally块中的代码总是会被执行,无论是否有异常发生。所以,在日志中看到初始化成功的信息并不代表实际上初始化操作成功。为了更准确地反映初始化的结果,建议在代码中根据实际情况进行异常捕获和处理,并相应地记录日志。

    2023-07-05 20:47:17
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载