gpt4 book ai didi

java - Hibernate批处理有什么用

转载 作者:行者123 更新时间:2023-11-29 07:43:58 24 4
gpt4 key购买 nike

我是 hibernate 的新手,我对 hibernate 批处理有疑问,我读了一些他们说的 hibernate 批处理教程

Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ )
{
Employee employee = new Employee(.....);
session.save(employee);

}
tx.commit();
session.close();

Hibernate 将在 session 级缓存中缓存所有持久对象,最终您的应用程序将在第 50,000 行左右的某个地方因 OutOfMemoryException 而失败。如果您使用 Hibernate 进行批处理,则可以解决此问题,例如,

Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ )
{
Employee employee = new Employee(.....);
session.save(employee);
if( i % 50 == 0 )
{ // Same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();

我的疑问不是在外部初始化 session ,而是为什么我们不能像这样将它初始化到 for 循环中,

Session session = null;
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ )
{
session =SessionFactory.openSession()
Employee employee = new Employee(.....);
session.save(employee);
}
tx.commit();
session.close();

这是正确的方法还是没有人建议我正确的方法?

最佳答案

没有。不要在 for 循环中初始化 session ;每次开始新 session 时,您都会开始一个新的批处理(因此您的批处理大小为一个,即它是非批处理的)。此外,您的方式会很多慢。这就是为什么第一个例子有

if( i % 50 == 0 ) { 
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}

这就是“刷新一批插入并释放内存”的目的。

关于java - Hibernate批处理有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27456242/

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