Hibernate的批量处理和分页技术、投影技术

投影查询——过滤部分字段
返回的List集合元素为Object[]

Query query = session.createQuery("select c.cname, c.csex from Customer c");
List list = query.list();
Iterator iter = list.iterator();
Object[] objs = null;
while(iter.hasNext()){
objs = (Object[]) iter.next();
for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
System.out.println("-------------------");

分页查询
 返回的list集合元素是Object

      Query query = session.createQuery("SELECT c FROM Customer c left join c.orders o where c.id=1");
	  query.setMaxResults(2);//设置每次查询最多查询多少记录,简单来说就是页大小
	  query.setFirstResult(2);//设置每次查询的开始位置,
	  Iterator iter = query.list().iterator();
	  while (iter.hasNext()) {
		System.out.println(((Customer)iter.next()));
	  }

批量处理

     @Test
	public void testBatchDealWith(){
		for(int i = 0; i <10000; i ++){
		Customer customer=new Customer();
		customer.setCustomerName("jeremy"+i);
		session.save(customer);
		if(i==20||i==40){
			System.out.println("--------------------------");
		}
		}
	}

因为默认情况下,Hibernate会缓存所有的持久对象在session级别的缓存,并最终应用程序会失败并发生OutOfMemoryException某处50,000条记录左右。如果使用的是批量处理与Hibernate解决这个问题。

要使用批量处理功能,首先设置hibernate.jdbc.batch_size为批量大小若干无论是在20或50根据对象的大小。这将告诉每X行插入批次hibernate的容器。为了实现这个在代码中,我们需要做一点修改如下:

@Test
public void testBatchDealWith(){
		
	for(int i = 0; i <10000; i ++){
	  Customer customer=new Customer();
	  customer.setCustomerName("jeremy"+i);
	  session.save(customer);
            if(i==50){
		 session.flush();
		 session.clear();
	    }
	}
}    
<property name="hibernate.jdbc.batch_size">20</property>

这样运行速度会得到很好的提升

转载于:https://www.cnblogs.com/jeremy-blog/p/4417534.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值