欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate的Query查询的缓存的问题

程序员文章站 2022-07-14 21:20:35
...

本文章是比较肤浅的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的语句了,因为都有缓存了。直接从缓存中读取数据,直到缓存消失。