执行休眠查询时发生错误

时间:2019-09-09 08:09:15

标签: java mysql hibernate jboss jboss5.x

执行抓取HQL查询时发生异常。该查询大部分时间都有效,但有时会显示此异常

数据库是MySQL,使用的服务器是JBoss 5.1.0 GA

显示的错误是:

  

org.hibernate.exception.GenericJDBCException:无法执行查询           在org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)           在org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)           在org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)           在org.hibernate.loader.Loader.doList(Loader.java:2231)           在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)           在org.hibernate.loader.Loader.list(Loader.java:2120)           在org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)           在org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)           在org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)           在org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)           在org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)           在java.lang.Thread.run(Thread.java:745)导致原因:org.jboss.util.NestedSQLException:Error; -嵌套可抛出:   (java.lang.OutOfMemoryError:超出了GC开销限制)           在org.jboss.resource.adapter.jdbc.WrappedConnection.checkException(WrappedConnection.java:873)           在org.jboss.resource.adapter.jdbc.WrappedStatement.checkException(WrappedStatement.java:852)           在org.jboss.resource.adapter.jdbc.WrappedResultSet.checkException(WrappedResultSet.java:1947)           在org.jboss.resource.adapter.jdbc.WrappedResultSet.getString(WrappedResultSet.java:892)           在org.hibernate.type.StringType.get(StringType.java:41)           在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)           在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)           在org.hibernate.type.AbstractType.hydrate(AbstractType.java:105)           在org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2124)           在org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1404)           在org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1332)           在org.hibernate.loader.Loader.getRow(Loader.java:1230)           在org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:603)           在org.hibernate.loader.Loader.doQuery(Loader.java:724)           在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)           在org.hibernate.loader.Loader.doList(Loader.java:2228)           ... 11更多原因:java.lang.OutOfMemoryError:超出了GC开销限制

2 个答案:

答案 0 :(得分:0)

您的应用程序似乎内存不足。查询可能会返回非常大的数据集,因此分配给应用程序的内存不足以处理该数据集。 您可以,

  • 增加分配给Java进程的内存,或者
  • 按子集(分页)获取数据,以避免一次返回大数据集。

答案 1 :(得分:0)

基于您的堆栈跟踪,查询已在数据库中成功执行,并且在JVM中准备结果集时发生错误。 此异常是与内存相关的问题,当您的程序需要的内存超过可用内存时,就会发生此问题。

"Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector"

有些可能性是

  • 配置:您的堆配置(Xmx)太小,无法满足您的需要,应该对其进行扩展。

  • 错误:您的查询中存在一个错误,该错误会生成比预期更大的结果集。

  • 设计:您需要重新设计代码,以便在不超出可用内存的情况下加载此数据。您可以进行分页并在每次迭代中存储一小部分数据。在这种情况下,在加载下一页之前,将每一页刷新给最终用户或消费者很重要。

GC overhead tutorial

Query Pagination tutorial