java – 使用Hibernate批量保存的更快方法?
我有一个程序,它逐行读取文本文件,并从每一行创建一个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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |