开发者社区> 问答> 正文

DruidDataSource不能destroy,要去掉init-method="init"

druid配置连接mysql

tomcat报错

11-May-2016 12:03:14.574 WARNING [http-nio-8080-exec-3] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ytst-api-framework] appears to have started a thread named [Druid-ConnectionPool-Destroy-934370022] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Thread.sleep(Native Method) com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2032)

去掉init-method="init"配置,问题解决。

请问:是我的mysql权限问题,还是DruidDataSource.destroy的Bug?不加init-method="init",会存在什么风险?

原提问者GitHub用户zhanglei86

展开
收起
山海行 2023-07-05 21:55:46 231 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    使用Spring框架集成Druid数据源时,通常会在applicationContext.xml中配置DruidDataSource bean,并指定init-method和destroy-method属性,用于在bean初始化和销毁时执行特定的方法。例如,可以使用init-method="init"和destroy-method="close"属性分别指定DruidDataSource的初始化和销毁方法。

    如果DruidDataSource不能destroy,可能是因为在配置文件中指定了错误的destroy方法,或者该方法不适用于DruidDataSource的销毁。针对这个问题,可以尝试以下解决方法:

    检查配置文件中的destroy方法
    需要检查applicationContext.xml中配置的DruidDataSource bean的destroy-method属性是否正确设置。如果指定了错误的方法名或者方法不适用于DruidDataSource的销毁,就会导致DruidDataSource不能正确销毁。

    去掉init-method属性
    如果仅仅是因为DruidDataSource不能destroy而导致的问题,可以尝试去掉init-method属性,让Spring框架使用默认的初始化方法。这样可以避免DruidDataSource的初始化方法导致的问题,从而更容易地销毁DruidDataSource。

    手动销毁DruidDataSource
    如果无法使用destroy-method属性销毁DruidDataSource,可以尝试手动销毁DruidDataSource。可以在Spring应用程序上下文关闭时手动销毁DruidDataSource,例如在web.xml中配置ContextLoaderListener,并重写contextDestroyed方法,在方法中手动销毁DruidDataSource。

    2023-07-30 09:38:29
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据你提供的错误日志,可以看出问题是由于未能正确停止Druid连接池引起的内存泄漏。而将配置中的init-method="init"移除后问题得到解决。在这种情况下,问题不是出现在MySQL的权限上,而是可能是Druid连接池的销毁操作引起的。

    在Druid连接池的配置中,init-method属性用于指定在初始化连接池时要调用的方法。在默认情况下,Druid连接池会在销毁时自动调用destroy方法来清理资源。然而,在某些情况下,这可能会导致内存泄漏,如在某些Web容器中无法正确关闭线程,导致线程无法终止。

    移除init-method="init"配置后,连接池的初始化方法不会被调用,而是采用默认的初始化方式。这样做的风险是如果你在连接池初始化时需要进行一些自定义的操作,如加载配置文件、设置参数等,那么这些操作将被忽略,可能会导致连接池的行为不符合预期。

    因此,建议你检查并确保你的Web容器能够正确关闭线程,以及Druid连接池的销毁操作能够正常执行。如果仍然遇到问题,可以进一步查看Druid的文档或者咨询Druid的开发者社区以获取更多帮助。

    2023-07-11 16:14:34
    赞同 展开评论 打赏
  • tomcat有警告日志而已吧,不影响使用

    原回答者GitHub用户wenshao

    2023-07-06 12:29:32
    赞同 展开评论 打赏
  • 从错误信息看,是因为 Tomcat 在关闭应用程序时,检查到一个线程名为 Druid-ConnectionPool-Destroy 的线程未结束,因此认定其为可能导致内存泄漏的线程,并报警告信息。

    DruidDataSource.destroy 方法是用于关闭数据源(即连接池)的,在应用程序结束前需要调用该方法来断开数据源与数据库之间的连接,防止资源浪费和内存泄露。因此,如果调用 DruidDataSource.destroy 方法后数据源仍未被成功关闭导致 Tomcat 出现上述警告信息,可能是因为某些连接仍在使用中或其它一些原因(比如代码中未正确调用 DataSource.getConnection 方法)。

    另外,不加初始化方法 init-method="init" 可能会出现连接池没有初始化的情况。需要在使用连接池之前初始化,否则无法正常使用。

    所以,请仔细检查你的代码,确保在正确的时机调用了连接池的 destroy 方法,并可以同时检查 getConnection 使用是否正确。同时,建议加上初始化方法 init-method="init" 来保证连接池的正常初始化。

    2023-07-06 09:18:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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