正如您从堆栈跟踪中看到的那样,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,
有什么想法吗?
是的..堆栈很旧。解决这个问题是一个想法。