在我的应用程序中,我正在使用CSVReader& hibernate从csv文件将大量实体(如1 500 000或更多)导入数据库。代码如下所示:
Session session = headerdao.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
int count = 0;
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
try {
if (nextLine.length == 23
&& Integer.parseInt(nextLine[0]) > lastIdInDB) {
JournalHeader current = parseJournalHeader(nextLine);
current.setChain(chain);
session.save(current);
count++;
if (count % 100 == 0) {
session.flush();
tx.commit();
session.clear();
tx.begin();
}
if (count % 10000 == 0) {
LOG.info(count);
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
tx.commit();
session.close();
对于足够大的文件(大约700 000行),我会遇到内存异常(堆空间)。
似乎问题在某种程度上与hibernate相关,因为如果我只注释session.save(current)行;它运行正常。如果它没有注释,那么任务管理器会不断增加javaw的内存使用量,然后在某些时候解析变得非常慢并且崩溃。
parseJournalHeader()
没有什么特别之处,只是根据csv读者提供的String[]
解析实体。
答案 0 :(得分:1)
会话实际上会在缓存中保留对象。你正在做正确的事情来处理一级缓存。但是还有更多东西可以阻止垃圾收集的发生。
尝试使用StatelessSession。