org.apahce.tomcat.jdbc.pool:关闭 Hibernate 连接时 JVM 内部 (sun.reflect) 中的 NullPointerException

问题描述 投票:0回答:0

正如您从堆栈跟踪中看到的那样,Hibernate

StatelessSession
close
方法调用
clearBatch
一些我不知道的
sun.proxy
包。调用tomcat jdbc pool然后JVM生成
sun.reflect
方法抛出异常:

java.lang.NullPointerException
sun.reflect.GeneratedMethodAccessor629.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:138)
com.sun.proxy.$Proxy43.clearBatch(Unknown Source)
org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.clearBatch(AbstractBatchImpl.java:165)
org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.releaseStatements(AbstractBatchImpl.java:156)
org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.release(AbstractBatchImpl.java:195)
org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:192)
org.hibernate.internal.StatelessSessionImpl.managedClose(StatelessSessionImpl.java:380)
org.hibernate.internal.StatelessSessionImpl.close(StatelessSessionImpl.java:358)

session.close()
在我的程序中调用
finally
块:

        @Override
        public int insertGeos(Iterable<OccurrenceGeo> geos) {
            StatelessSession session = null;
            try {
                session = dao.getETLEntityConnection();
                session.beginTransaction();
                int i = 0;
                for (OccurrenceGeo geo : geos) {
                    session.insert(geo);
                    i++;
                    if (i % 100 == 0) reportStatus("Geos: " + i);
                }
                session.getTransaction().commit();
                return i;
            } catch (Exception e) {
                if (session != null) session.getTransaction().rollback();
                throw e;
            } finally {
                if (session != null) session.close();
            }
        }

值得注意的是,for 循环需要多个小时才能插入这些“geos”,因此这可能与数据库超时等有关。但是

NullPointerException
是一个奇怪的症状。 据我了解,程序没有去
catch
-block,

有什么想法吗?

  • Java openjdk-1.8.0.362.b08-1.el7_9.x86_64
  • Tomcat jdbc 池 8.5.32
  • 休眠 5.1.1.

是的..堆栈很旧。解决这个问题是一个想法。

java hibernate tomcat connection-pooling
© www.soinside.com 2019 - 2024. All rights reserved.