[英]Hibernate's setFirstResult() issue with Oracle jdbc driver
[英]Oracle leaks threads on when closing Hibernate Sessions with Oracle JDBC driver
我们正在使用 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();
}
}
}
protected void cancelTimers() {
try {
for (Thread thread : Thread.getAllStackTraces().keySet())
if (thread.getClass().getSimpleName().equals("TimerThread"))
cancelTimer(thread);
} catch (Throwable e) {
e.printStackTrace();
}
}
private void cancelTimer(Thread thread) throws Exception {
// Timer::cancel
Object queue = ReflectionUtils.getFieldValue(thread, "queue");
Method m = queue.getClass().getDeclaredMethod("isEmpty");
m.setAccessible(true);
if ((boolean) m.invoke(queue)) {
synchronized (queue) {
ReflectionUtils.setFieldValue(thread, "newTasksMayBeScheduled", false);
m = queue.getClass().getDeclaredMethod("clear");
m.setAccessible(true);
m.invoke(queue);
queue.notify();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.