gpt4 book ai didi

java - 使用 Hibernate 进行批量保存的更快方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:28 26 4
gpt4 key购买 nike

我有一个程序,它逐行读取文本文件,并从每一行创建一个 Hibernate 实体对象,并保存它们。我有几个这样的文本文件要处理,每个文件大约有 300,000 行。我发现我当前的实现速度非常慢,我想知道我是否可以做些什么来改进。

我的主要方法像这样逐行处理文本文件:

// 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 时,持久性提供程序将根据数据库选择一个适当的策略,因此,根据您的数据库,您可能必须为 更改它TABLESEQUENCE 策略(因为 Hibernate 可以使用 hi-lo 算法缓存 ID)。

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

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

关于java - 使用 Hibernate 进行批量保存的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com