一尘不染

Hibernate批处理有什么用

hibernate

我是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将所有持久化的对象缓存在会话级缓存中,最终您的应用程序将在第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();

我的疑问是不是要在外部初始化会话,为什么我们不能将其初始化为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();

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


阅读 191

收藏
2020-06-20

共1个答案

一尘不染

不。不要在for循环中初始化会话;每次启动新会话时,都会启动一个新批处理(因此您的批处理大小是自己的,即不分批处理)。同样,这将 大大
减慢您的前进速度。这就是为什么第一个例子有

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

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

2020-06-20