保存大量实体时,Hibernate会导致内存不足异常

时间:2011-05-26 10:00:11

标签: java hibernate csv heap space

在我的应用程序中,我正在使用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[]解析实体。

1 个答案:

答案 0 :(得分:1)

会话实际上会在缓存中保留对象。你正在做正确的事情来处理一级缓存。但是还有更多东西可以阻止垃圾收集的发生。

尝试使用StatelessSession。