- 使用Hibernate将100 000 条记录插入到数据库的一个很自然的做法可能是这样的:
- 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();
- 这段程序大概运行到 50 000 条记录左右会失败并抛出内存溢出异常(OutOfMemoryException)。 这是因为 Hibernate 把所有新插入的客户(Customer)实例在 session级别的缓存区进行了缓存的缘故。
- 如果要执行批量处理并且想要达到一个理想的性能, 那么使用JDBC的批量(batching)功能是至关重要。将JDBC的批量抓取数量(batch size)参数设置到一个合适值 (比如,10-50之间):
- hibernate.jdbc.batch_size 20 hibernate.jdbc.batch_size 可以在Hibernate配置文件中配置
- 如果要将很多对象持久化,则必须通过经常的调用flush() 以及稍后调用clear()来控制第一级缓存的大小。
- 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 ) //20, same as the JDBC batch size //20,与JDBC批量设置相同
- {
- session.flush(); //flush a batch of inserts and release memory:
- session.clear(); //将本批插入的对象立即写入数据库并释放内存
- }
- }
- tx.commit();
- session.close();
Hibernate批量处理
最新推荐文章于 2024-07-06 16:26:54 发布