从MySQL db中获取时抛出TransactionSystemException java.lang.OutOfMemoryError:Java堆空间

时间:2017-05-22 20:14:45

标签: java spring hibernate spring-boot

我收到以下异常

[2017-05-22 22:02:43.930] boot - 8169 ERROR [http-nio-8080-exec-1] ---  TransactionInterceptor: Application exception overridden by rollback exception
   java.lang.OutOfMemoryError: Java heap space
     at com.mysql.jdbc.Buffer.<init>(Buffer.java:54)
     at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1972)
     at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3285)
     at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:463)
     at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3009)
     at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2257)
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2650)
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545)
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901)
     at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2002)
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
     at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
     at org.hibernate.loader.Loader.doQuery(Loader.java:910)
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
     at org.hibernate.loader.Loader.doList(Loader.java:2554)
     at org.hibernate.loader.Loader.doList(Loader.java:2540)
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
     at org.hibernate.loader.Loader.list(Loader.java:2365)
     at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718)
     at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
     at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402)

每当为特定条目运行以下方法时:

public Person getPerson(String id) {
   Criteria criteria = this.getSession().createCriteria(Person.class);
   criteria.add(Restrictions.eq("id", id));
   Person p = (Person) criteria.uniqueResult();
   return p;
}

增加内存似乎没有帮助,只是挂起。

关于如何解决此问题的任何想法?加载其他Person实体不会导致该问题。

一些可能有用的信息:

 <springframework.version>4.2.1.RELEASE</springframework.version>
 <hibernate.version>4.3.11.Final</hibernate.version>
 <mysql.connector.version>5.1.36</mysql.connector.version>

请帮助。

1 个答案:

答案 0 :(得分:0)

简而言之,我通过延迟加载解决了这个问题。

我的Person实体引用了几个集合,这些集合确实在急切地获取。我所有收藏中的以下注释都为我解决了这个问题:

@ElementCollection(fetch = FetchType.LAZY)
现在看来显而易见;我很惊讶,因为我已经运行了我的应用程序很长一段时间,定期加载Person实体,之前从未遇到过这个问题。