hibernate的Query查询的缓存的问题

本文章是比较肤浅的hibernate缓存理解,缓存使用的不好会造成1+N查询的问题,会很浪费数据库资源。缓存不提倡什么方法都使用,我觉得只有真正需要的地方才少量使用比较适合。

最近在检查hibernate的HQL语句,发现我使用的hibernate的缓存查询方法出现了奇怪的问题。

我的缓存查询方法核心代码如下:

session.setCacheMode(CacheMode.NORMAL);//hibernate的session
Query q = session.createQuery(hql);//hibernate的query
q.setCacheable(true);//设置使用缓存,默认不使用

这样每次调用该方法进行查询时就会使用缓存(如果你的po配置了缓存的话)

我使用hibernate的2表关联查询 from a,b where a.id=b.id and a.type=?

我的mapping文件中,我的a对象的mapping定义了

<cache usage="read-write" />

而b则没有,结果第一次查询语句输出没什么问题,但是第二次开始,后台的输出每次刷新页面都会有类似:

select b.id,b.name.b.age ..... from b where b.id=?
 

这样的语句输出。我觉得很奇怪,以为语句出问题了,因为要输出语句应该也是输出2表关联查询的语句才对,怎么单独出现查询其中一个表的sql语句呢?难道我的多表关联查询没作用??后来我把缓存的使用关闭,也就是

q.setCacheable(false);//不使用缓存

 这样测试,控制台输出的都是关联2个表查询的sql语句,这样说来关联查询是正常使用的,而一旦使用了缓存,则只会出现一个表单独再查的情况。后来仔细分析发现原来开启了缓存查询,而没有把被查询的对象po设置

<cache usage="read-write" />

 hibernate 就会不断的从数据库查询对象。后来我把b的mapping也加上了

<cache usage="read-write" />
 

就不再出现单查b的语句了,因为都有缓存了。直接从缓存中读取数据,直到缓存消失。

猜你喜欢

转载自panshunchang.iteye.com/blog/1246398