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的语句了,因为都有缓存了。直接从缓存中读取数据,直到缓存消失。