我遇到了hibernate + java的问题。我有一个接受文件的类,将其解析为CSVRecord,然后通过processRecord()将每一行转换为一个对象(classA),然后我尝试在我的数据库中找到该对象,如果我有更新对象“else”我是第一次保存它。 处理1000行后,我提交事务,清理会话并重新开始事务。 问题是当开始处理文件(1百万条记录)时内存java消耗开始增长很多(2Gb)并且最后不发布,所以如果我需要方法处理另一个文件我没有内存,我从来没有一个内存异常,因为我仍然有内存,但它在服务器中不会是相同的。 我尝试使用flush()和clear()执行相同的代码,但两者都没有, 代码是这样的:
db = new DB();
db.open();
trn = db.session().beginTransaction();
for (CSVRecord line : lines) {
try {
if ((classA = processRecord(line)) != null) {
classB b = findObject(classA);
if (b != null) {
db.session().update(b);
} else {
db.session().save(classA);
}
if (recordNumber % 1000 == 0) {
trn.commit();
db.session().clear();
trn = db.session().beginTransaction();
}
recordNumber++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
db.close();
答案 0 :(得分:0)
使用无状态会话,因为它没有持久性上下文缓存,与目前使用的方法相比可以提高性能
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
session.insert(yourentiry);
}
tx.commit();
session.close();