您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么会收到JDBC驱动程序警告和ThreadLocal错误?

为什么会收到JDBC驱动程序警告和ThreadLocal错误?

这些是在服务器保持运行状态下重新部署应用程序时可能发生的错误消息。

如果是关闭场景或开发重新部署,则可以安全地忽略这些消息,仅当您需要在生产中重新部署时,这些消息才变得很重要,这种情况很少见。即使在生产中,大多数时候我们也想停止服务器进程并完全重启它。这是每个消息的一些详细信息,其含义是:

警告:Web应用程序[]注册了JDBC驱动程序[com.MysqL.jdbc.Driver],但在Web应用程序停止时未能注销它。为了防止内存泄漏,已强制注销JDBC驱动程序。

JDBC驱动程序在启动时以JVM级别单例注册,这是由服务器通过在服务器级别的文件夹中发布驱动程序jar来完成的。

在这种情况下,应用程序似乎带有驱动程序本身,而不是驱动程序被部署的方式。

解决此问题,请从应用程序中删除驱动程序,然后在服务器级别上注册它。如果多个应用程序具有相同的驱动程序,这也会导致内存泄漏-

严重:Web应用程序[]创建了一个ThreadLocal,其键类型为[java.lang.ThreadLocal](值[java.lang.ThreadLocal@1087985b]),并且值类型为[org.hibernate.internal.SessionImpl],但未能成功在Web应用程序停止时将其删除。线程将随着时间的流逝而更新,以尝试避免可能的内存泄漏。

这意味着一个应用程序Spring线程在该线程中存储了一个Hibernate会话(每个线程作为数据存储区,可以通过ThreadLocal附加事物)。

但是,在重新启动应用程序时,线程没有清理会话,因此在重新使用线程后,重新部署后,该线程中存储的该变量可以看到。

这可能令人惊讶,但最糟糕的是,该会话指向其他对象,这些对象本身指向类,而这些对象指向重新部署之前的旧类加载器。

这意味着由于泄漏到先前部署的对象的“链接”,将不会大量收集对象树。结果是ClassLoader内存泄漏

该消息指出,这种情况可能是由于未清理的ThreadLocals而发生的,并且将采取一些预防措施(开始杀死线程并创建新线程,而不是创建池,以消除泄漏的线程局部变量)。

总之,如果您不需要在生产中进行重新部署并始终重新启动服务器,则可以安全地忽略这些消息。

其他 2022/1/1 18:14:24 有673人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶