【发布时间】:2020-06-30 12:24:46
【问题描述】:
我们正在使用 Hibernate 运行一个多类加载器 Java 应用程序:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.16.Final</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc10-production</artifactId>
<version>19.7.0.0</version>
<type>pom</type>
</dependency>
我们注意到,即使关闭所有 Hibernate 和工件以及 unregister 驱动程序,我们仍然会看到线程保持活动状态,这些线程在 contextclassloader 中保存类加载器。有没有办法关闭这些线程Timer 和OracleTimeoutPollingThread?
public void close() throws IOException {
sessionFactory.close();
session.close();
factory.close();
try {
Enumeration<Driver> de = DriverManager.getDrivers();
while(de.hasMoreElements()) {
Driver d = de.nextElement();
if(d.getClass().getClassLoader() == RGHibernate.class.getClassLoader()) {
DriverManager.deregisterDriver(d);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【问题讨论】:
-
您确定每个驱动程序都未注册吗?什么是 RGHibernate 类?
-
RGHibernate 是实现 close() 方法的方法,它关闭所有休眠的 close() 方法。并在当前的 URLClassLoader 中加载。
-
@SabareeshMuralidharan 是的,我确认它已取消注册(),但一个实例由 OracleDriver 中的静态字段保存为默认驱动程序
-
我猜有一个已知的错误。静态字段
-
有没有办法以某种方式关闭这个默认驱动程序?
标签: java oracle hibernate classloader contextclassloader