繁体   English   中英

Oracle 在关闭 Hibernate 与 Oracle 的会话时泄漏线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM