加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用Hibernate批量保存的更快方法?

发布时间:2020-12-15 04:52:53 所属栏目:Java 来源:网络整理
导读:我有一个程序,它逐行读取文本文件,并从每一行创建一个Hibernate实体对象,并保存它们.我有几个这样的文本文件要处理,每个文件都有大约300,000行.我发现我目前的实施速度非常慢,而且我想知道我能做些什么来改进. 我的main方法逐行处理文本文件,如下所示: // r
我有一个程序,它逐行读取文本文件,并从每一行创建一个Hibernate实体对象,并保存它们.我有几个这样的文本文件要处理,每个文件都有大约300,000行.我发现我目前的实施速度非常慢,而且我想知道我能做些什么来改进.

我的main方法逐行处理文本文件,如下所示:

// read the file line by line
FileInputStream fileInputStream = new FileInputStream(new File(fileName));
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int lineCount = 0;
String line = bufferedReader.readLine();
while (line != null)
{
    // convert the line into an Observations object and persist it
    convertAndPersistObservationsLine(line);

    // if the number of lines we've processed has built up to the JDBC batch size then flush
    // and clear the session in order to control the size of Hibernate's first level cache
    lineCount++;
    if (lineCount % JDBC_CACHE_SIZE == 0)
    {
        observationsDao.flush();
        observationsDao.clear();
    }

    line = bufferedReader.readLine();
}

convertAndPersistObservationsLine()方法只是将文本行拆分为标记,创建新的实体对象,使用来自标记的数据填充实体的字段,然后通过调用Hibernate的Session.saveOrUpdate()方法的DAO保存对象. DAO方法flush()和clear()是对相应Hibernate Session方法的直接调用.

Hibernate属性’hibernate.use_second_level_cache’设置为false,Hibernate属性’hibernate.jdbc.batch_size’设置为50,Java常量JDBC_CACHE_SIZE也是如此.

有人可以建议一个更好的方法来解决这个问题,或者对上面的任何调整可能会改善这个批量加载程序的性能吗?

在此先感谢您的帮助.

– 詹姆士

解决方法

代码本身和Hibernate配置看起来是正确的(通过正确我的意思是他们遵循文档中的 batch insert惯用法).但是这里有一些额外的建议:

如前所述,请确保您没有使用像IDENTITY那样失败批处理的ID生成器.使用GenerationType.AUTO时,持久性提供程序将根据数据库选择适当的策略,因此,根据您的数据库,您可能必须更改TABLE或SEQUENCE策略(因为Hibernate可以使用hi-lo算法来缓存ID) ).

还要确保Hibernate按预期进行批处理.为此,请激活日志记录并监视BatchingBatcher以跟踪其正在执行的批处理的大小(将被记录).

在您的特定情况下,您可能实际上考虑使用the StatelessSession interface(一旦问题解决了当然).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读