`

Hibernate性能优化

阅读更多

使用Hibernate要从以下几个方面入手解决性能问题.

一、尽量降低数据库的访问次数。

解决方案:充分利用Hibernate的缓存,对延迟检索和立即检索设置批量检索数目。

二、避免多余加载程序不需要的数据

可以采用延迟策略和集合过滤。

三、避免查询无用的字段。

可以使用投影查询,只查出实例的一部分字段。

使用Iterate()方法。

在这里特别注意Iterate()方法和List()方法的区别。否则不仅起不到优化的效果,反而还加大系统的开销。Iterate()方法是基于Hibernate缓存基础之上的,包括一级和二级缓存。Iterate()的实现原理是:首先从数据库中检索ID,然后在SESSION的一级缓存或SessionFactory的二级缓存中查找对应ID的对象,如果有直接从缓存中提取该对象,否则再从数据库中查询。由此,你没有用到缓存,那么用Iterate将会频繁的查询数据通库。下面举个例子看一下应该更明白了。

前提在Session缓存范围内;

首先执行:Query query1 =session.createQuery("from User where id<=100");

List resultList1=query1.list();

Query query2=session.createQuery("from User where id<50");

List resultList2=query2.iterate();

这个事务内执行的SQL为:from User where id<=100; from User where id<50;

因为第一次查询出的结果为ID是100以内的User对象,并且这些对象会被缓存在session的一级缓存中。所以第二次能过iterate()仅仅是查询出Id,根据id在一级缓存中可以找到ID是50以内的所有对象,这样操作性能当然有所提高了。

再看另一种情况:

首先执行:Query query1 =session.createQuery("from User where id<50");

List resultList1=query1.list();

Query query2=session.createQuery("from User where id>50 and id <100");

List resultList2=query2.iterate();

大家知道执行这样的HQL,hinernate会执行多少条SQL语句吗?结果是1+1+49=51条SQL语句,有些人会问为什么会执行如此多的SQL呢?别急,继续看下去你会明白的。

执行刚才的("select * from User where id<50")这个HQL只会查询一次数据库,并且把ID<50的对象都缓存起来了。当执行("select * from User where id>50 and id <100")时,先查询了一次数据库:select id from User where id>50 and id<100,然后再根据查出的ID在一级缓存中查找有没有对应的User对象。这时肯定找不到了,因为缓存中只有ID<50的User对象,不可能找出ID>50&&ID<100的User对象了。那怎么办呢,总不能给用户仅仅回ID吧,这时降根据ID查询数据库了,所以这时候再执行49条SQL语句!感觉到了吗,什么时候用iterate?

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics