什么是查询缓存?

参考,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 之后,解决了 这个问题。

05-27 22:12