当我试图从数据库中检索大量记录时,我正在处理一个问题。当记录数超过90.000条时,似乎无法检索元素。
当发生这种情况时,我会得到以下异常:
com.sun.jdi.ObjectCollectedException occurred while retrieving value.我使用的代码如下所示:
Session objSession;
List<GroupEntity> colResults;
objSession = this.objSessionFactory.openSession();
try
{
objQuery = objSession.createQuery("FROM GroupEntity WHERE (strDomain = :Domain)")
.setParameter("Domain", strDomain)
.list();
}
catch (Exception objException)
{
throw new GroupException("Could not retrieve the list of WebFiltering groups to scan");
}
objSession.close();
return colResults;我尝试对每组1.000条检索到的结果进行分页,当我插入多达89.999条记录时,使用这种方法,列表就没问题了。但是,当我超过90.000时,我会得到同样的异常。
有没有关于如何面对这个问题的想法?
发布于 2018-08-10 01:29:03
如果您要处理如此大量的数据,我建议您对ScrollableResults:https://grokonez.com/hibernate/resolve-hibernate-outofmemoryerror-problem-hibernate-batch-processing使用批处理
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
ScrollableResults dataCursor = session.createQuery("FROM Data").scroll();
int count = 1;
while (dataCursor.next()) {
Data data = (Data) dataCursor.get(0);
String newText = Utilities.generatedRandomString();
data.setText(newText);
session.update(data);
if (count % 50 == 0) {
System.out.println("============================log: count = " + count);
session.flush();
session.clear();
}
count++;
}
tx.commit();
} catch (Exception e) {
if (null != tx) {
tx.rollback();
}
} finally {
session.close();
}在这种情况下,会话不会在内存中保留所有90000条记录。
发布于 2018-08-10 01:41:11
当你引用的对象被垃圾回收时,"com.sun.jdi.ObjectCollectedException“就会发生。
java arrayList上没有这样的大小限制。
https://stackoverflow.com/questions/51772505
复制相似问题