读书人

hibernate的批量处置

发布时间: 2012-10-07 17:28:51 作者: rapoo

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]

读书人网 >软件架构设计

热点推荐