我得到这个例外:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2882) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390) at java.lang.StringBuilder.append(StringBuilder.java:119) at java.util.AbstractMap.toString(AbstractMap.java:493) at org.hibernate.pretty.Printer.toString(Printer.java:59) at org.hibernate.pretty.Printer.toString(Printer.java:90) at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97) at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35) at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1114) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
在此代码:
Query query = null; Transaction tx= session.beginTransaction(); if (allRadio.isSelected()) { query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0"); } else if (periodRadio.isSelected()) { query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0 and m.receivingDate between :start and :end"); query.setParameter("start", start); query.setParameter("end", end); } final List<Document> documents = query.list(); query = session.createQuery("select o from Organization as o"); List<Organization> organizations = query.list(); <---AT THIS LINE tx.commit();
我连续2次查询。如果我评论其中之一,其他工作正常。
如果我删除交易,那么事物异常便消失了。这是怎么回事?这是内存泄漏之类的吗?提前致谢。
我从这种事情的多年痛苦中得到了一个提示:答案通常会仔细地隐藏在堆栈跟踪的前10行中的某个位置。始终多次读取堆栈跟踪,如果没有提供足够的帮助,请读取发生故障的方法的源代码。
在这种情况下,问题出在Hibernate漂亮打印机中的某个地方。这是一个日志记录功能,因此问题在于Hibernate试图记录一些巨大的字符串。请注意,在尝试增加StringBuilder的大小时它如何失败。
为什么要尝试记录巨大的字符串?我不能从您提供的信息中说出来,但是我想您的组织实体中有很大的内容(也许是BLOB吗?),Hibernate尝试记录查询已从数据库中拉出的对象。映射中也可能是错误的,因为渴望进行提取会拉入许多相关的对象- 例如,由于错误的外键定义,导致加载整个表的子集合。
如果映射错误,则修复映射将解决问题。否则,最好的选择是关闭此特定的日志记录功能。在一个非常相似的问题上存在一个现有的问题,答案中有一些有用的建议。