什么是查询缓存?java
参考,https://blog.csdn.net/qq_37630354/article/details/76138749sql
https://www.jb51.net/article/123108.htm数据库
也就是若是开启了查询缓存, 在 没有使用二级缓存的状况下,会 缓存第一次查询出来的数据的id。缓存
第二次查询的时候, 若是查询的参数和查询语句没有变化,那么就会使用 第一次查询的出来的数据id 去 查询数据库。服务器
能够起到优化SQL, 提升性能的做用。app
同时 这也一个问题,就是 若是 改了数据库内容了,那么 可能 查询出来的数据是不符合 实际状况的。性能
好比 关联表的数据删除了,可是 主表的数据还在,且 条件是 关联表有数据的条件,那么 在 查询缓存下,数据仍是没有一点变化。优化
为何 在关联表查询缓存下使用HQL,而不是sql去查询?ui
今天就遇到了这个问题, this
好比 主表 eims_organization, 关联表 eims_organization_auth
代码:
User user=this.getCurrentUser(); StringBuilder sb = new StringBuilder(); sb.append( " EXISTS ( select 1 from eims_organization_auth as au where au.eims_org_id={alias}.id and au.user_id='") .append(user).append("') "); pageBean.addCriterion(Restrictions.sqlRestriction(sb.toString())); List<EimsOrganization> list = eimsOrganizationService.list(pageBean); return DataGridTransforms.JQGRID.transform(list); 也就是 EimsOrganization 知足的条件是 当前登陆用户,且 表 eims_organization_auth 权限绑定了 EimsOrganization
出现的问题就是 , 好比 当 操做 删除绑定 EimsOrganization 管理的 eims_organization_auth 数据的时候,
上面的代码 执行的结果并无变化。 这就没有效果了。并且 用户从新退出登陆都没有用,服务器重启才有效果。
也就是 在查询缓存的状况下, 当 关联表 eims_organization_auth 数据删除的时候, 查询缓存 按理 是会被清掉的。
只是 由于 代码里面 使用了SQL 而不是HQL 致使 查询缓存 清不了。改成 HQL 以后,解决了 这个问题。