我是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();
是正确的方法还是没有人建议我正确的方法?
不。不要在for循环中初始化会话;每次启动新会话时,都会启动一个新批处理(因此您的批处理大小是自己的,即不分批处理)。同样,这将 大大 减慢您的前进速度。这就是为什么第一个例子有
if( i % 50 == 0 ) { //flush a batch of inserts and release memory: session.flush(); session.clear(); }
这就是“刷新一批插入并释放内存”的目的。