Hibernate,保存1Millon实体,消耗大量内存

时间:2017-09-03 13:30:44

标签: java hibernate memory transactions save

我遇到了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();

1 个答案:

答案 0 :(得分:0)

使用无状态会话,因为它没有持久性上下文缓存,与目前使用的方法相比可以提高性能

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    session.insert(yourentiry);
}
tx.commit();
session.close();