hibernate的批量处理
在一般情况下,使用hibernate将500000条记录插入到数据库中,通常的做法是:
Session session = sessionFactory.openSession();Transaction tran = session.beginTransaction();for(int i =0;i<500000;i++){ Customer custmoer = new Custormer(....); session.save(custmoer);}tran.commit();session.close();?
通常执行结果会抛出内存溢出异常(OutOfMemoryException).
原因是因为实例在session级别的缓存区进行了缓存的缘故;
解决方法使用JDBC的批量(Batching)功能。使用JDBC的批量抓取数量(Batch Size)参数设置到一个合适值;
hibernate.jdbc.batch_size 20
如果要将很多对象持久化,必须经常flush()以及使用clear()来控制一级缓存的大小。如下
Session session = sessionFactory.openSession();Transaction tran = session.beginTransaction();for(int i =0;i<500000;i++){ Customer custmoer = new Custormer(....); session.save(custmoer); if(i%20==0){ session.flush(); session.clear(); }}tran.commit();session.close();?在批量更新中也可以使用,此外在返回很多数据的查询时,需要使用scroll方法以便充分利用数据库的游标带来的好处。
如:
Session session = sessionFactory.openSession();Transaction tran = session.beginTransaction();ScrollableResults customers = session.getNamedQuery("GetCustomers").setCacheMode(CacheModel.IGNORE).scroll(ScrollMode.FORWARD_ONLY);int count = 0;while(customers.next()){ Customer cust = (Customer )customers.get(0); customer.update(...); if(++count%20==0){ session.flush(); session.clear(); }}tran.commit();session.close();?
1 楼 贰哲子 2012-03-15 session.flush()具体作用是什么?[size=xx-small][/size]