Hibernate 性能刷新 v 提交
我正在创建一个休眠组件来与大量传入数据进行交互以进行持久保存,保存(创建)和更新数据量为数百万行。
我知道刷新 v 提交的主要区别,例如刷新将“脏”数据同步到可持久的底层数据中,并且刷新允许您与底层的持久数据同步而无需实际提交,以便可以回滚事务如果需要的话。提交本质上是将所有持久数据提交到数据库。
我正在创建一个休眠组件来与大量传入数据进行交互以进行持久保存,保存(创建)和更新数据量为数百万行。
我知道刷新 v 提交的主要区别,例如刷新将“脏”数据同步到可持久的底层数据中,并且刷新允许您与底层的可持久数据同步而无需实际提交,以便可以回滚事务如果需要的话。提交本质上是将所有持久数据提交到数据库。
批量插入的合理尺寸是多少? IS 50 是合理性能的最大数量,所以类似于:
for (i < 1000000)
if(i % 50 ) {
session.flush()
}
我收集 50 应该与 hibernate.jdbc.batch_size 50 中的值匹配
Im creating a hibernate component to interact with large incoming data to persist, both save(create) and update data with volumes in the million of rows.
I am aware of the main differences around flush v commit, for example flush syncing the "dirty" data into the persistable underlying data, and that flush allows you to sync with the underlying persistable data without actually committing so that the transaction can be rolled back if required. Commit essentially commits all persistable data to the database.
Im creating a hibernate component to interact with large incoming data to persist, both save(create) and update data with volumes in the million of rows.
I am aware of the main differences around flush v commit, for example flush syncing the "dirty" data into the persistable underlying data, and that flush allows you to sync with the underlying persistable data without actually committing so that the transaction can be rolled back if required. Commit essentially commits all persistable data to the database.
Whats a reasonable size to do a batch insert? IS 50 the max amount for reasonable performance so something like:
for (i < 1000000)
if(i % 50 ) {
session.flush()
}
I gather 50 should match the value in the hibernate.jdbc.batch_size 50
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这取决于你的数据。批量大小是休眠在其会话上保留的项目数量与往返数据库进行刷新所涉及的延迟之间的平衡。如果您的批量大小太小,您最终将需要多次往返数据库。如果您的批量大小太大,您最终将在休眠会话中保存许多对象 - 如果您的对象很胖,这可能会成为问题。
我想说 50 是一个很小的数字:
1M / 50 = 20000
往返。我建议你从更大的数字开始并衡量性能。顺便说一句,这仅适用于批处理操作:hibernate.jdbc.batch_size
为 50,适用于常规应用程序事务。PS 不要忘记在刷新后清除休眠会话,否则即使在刷新后休眠也会将持久化对象保留在内存中。
It depends on your data. The batch size is a balance between the amount of items that hibernate will keep on its session, and the latency that is involved in making roundtrips to the db for flushing. If your batch size is too small, you'll end up making many roundtrips to the db. If your batch size is too large, you will end up holding many objects in hibernate's session - this can be a problem if your objects are fat.
I would say 50 is a low number:
1M / 50 = 20000
round trips. I would say for you to start with a bigger number and measure the performance. By the way, this applies for batch operations only:hibernate.jdbc.batch_size
is 50 is for regular app transactions.PS don't forget to clear the hibernate session after flush, or else hibernate will hold the persisted objects in memory even after flush.