什麼是查詢緩存?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 以後,解決了 這個問題。