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>
这样运行速度会得到很好的提升
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。