`
ch_space
  • 浏览: 109103 次
  • 性别: Icon_minigender_1
  • 来自: 农村进城务工人员
社区版块
存档分类
最新评论

hibernate学习笔记6--原生SQL、Query的list和iterator

阅读更多
1、原生SQL,为复杂查询提供帮助

getUser(){
  SQLquery q=session.createSQLQuery("select {u.*} from users u where username='"+username+"'",u);
  q.addEntity("u",Users.class);//u是表的别名
  return (Users)q.setMaxResults(1).uniqueResult();
}


2、Query的list与iterator

引用

robbin:
众所周知,List仅仅会填充二级缓存,却不能利用二级缓存,而iterator可以读二级缓存,然而无法命中的话,效率却很低。一个最好的办法就是,第一次查询使用List,随后的查询使用iterator,现在的问题是如何做到第一次查询使用List,随后查询使用iterator。

先来考察一下缓存的作用:缓存之所以可以命中,前提条件是该数据被使用的非常频繁,同时更新的可能性相当小,如果数据会频繁修改,那么毫无疑问,缓存不会带来任何好处。明确了这一点,我们就明白什么对象应该进行缓存了。显然,对于那些经常会被访问到的小批量的诸如基础信息,用户和权限信息是非常适合进行缓存的,这些数据我们可以在应用启动的时候就执行一次list方法查询,进行缓存填充(例如写一个InitBean类进行数据缓存初始化),此外在数据被修改的时候,再次执行list方法,进行缓存填充。而在使用这些数据的其他地方,统统使用iterator方法。这样就可以实现所谓的第一次查询使用List,随后的查询使用iterator了。


但在我的测试中,iterator方法首先会检索符合条件对象的OID(延迟加载其他属性!),当使用对象的非OID属性时,会再次发出SQL语句检索对象(不知道是在缓存还是数据库?),也就是说检索了两次,这样性能会像robbin说的比list高吗?(表示怀疑)

分享到:
评论
1 楼 kgdso 2010-08-10  
的确就是这样的。iterator也会先执行一次查询,类似select id from tablexxx, 然后再根据这些id去缓存那里检索,看看有没有现成的对象可以拿,如果没有的话,还要执行一次select from tablexxx where id=x来从数据库取得这个对象。

所谓iterator性能比list高主要是select from table 要比select id from table要快吧。

相关推荐

Global site tag (gtag.js) - Google Analytics