批量插入数据会带来性能上的损耗,但是合理的设置会使性能得到最大的优化。我们来看一个批量插入的代码:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Customer customer = new Customer(.....); session.save(customer); } tx.commit(); session.close();
这个代码试图把1000000条customer记录批量插入到数据库,但是这会带来内存的溢出,因为hibernate在commit()之前,会将所有的数据放到缓存当中,当缓存满了以后自然就溢出了。所以经过改进,代码可以这么写:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Customer customer = new Customer(.....); session.save(customer); if ( i % 20 == 0 ) { //flush 插入数据和释放内存: session.flush(); session.clear(); } } tx.commit(); session.close();
每次只插入20条记录,这样就不会造成内存的溢出了。