什么是查询缓存?
参考,https://blog.csdn.net/qq_37630354/article/details/76138749
https://www.jb51.net/article/123108.htm
也就是如果开启了查询缓存, 在 没有使用二级缓存的情况下,会 缓存第一次查询出来的数据的id。
第二次查询的时候, 如果查询的参数和查询语句没有变化,那么就会使用 第一次查询的出来的数据id 去 查询数据库。
可以起到优化SQL, 提高性能的作用。
同时 这也一个问题,就是 如果 改了数据库内容了,那么 可能 查询出来的数据是不符合 实际情况的。
比如 关联表的数据删除了,但是 主表的数据还在,且 条件是 关联表有数据的条件,那么 在 查询缓存下,数据还是没有一点变化。
为什么 在关联表查询缓存下使用HQL,而不是sql去查询?
今天就遇到了这个问题,
比如 主表 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 之后,解决了 这个问题。