1、一級緩存是session級的緩存,session結束即事務提交,session關閉,緩存清除。效果不大
get方式:一個session內,第二次查詢不連數據庫。適用於一級緩存
load方式:懶加載查詢(查詢時不執行sql,使用結果時才會執行sql),第二次查詢不連數據庫。適用於一級緩存
createQuery(hql).list():查詢了整個list,第一次調用list()時,執行sql。第二次查詢時,又執行了sql,說明不使用一級緩存。也就是不使用二級緩存
createQuery(hql).iterate():只查詢了id,第一次調用iterate()時,執行sql,查詢id(查詢部分屬性),當得到對象並且使用時,會出現查詢整個實體語句。但第二個iterate()時,執行sql(不適用一級緩存),查詢id(部分字段) 得到對象時不會產生語句,適用一級緩存。查詢部分字段,返回object[]數組,不適用一級緩存。查詢部分字段,封裝成對象
例如String sql = select new UserPoJo(u.id,u.name) from UserPoJo u;第二次同樣執行了sql,也不適用一級緩存,緩存只認全部字段的對象。
save:在一個session中,先新增save ,然后get 或者load save方法也是使用一級緩存
2、二級緩存是sessionFactory級別緩存。進程級緩存,工廠級緩存,可以被所有session共享。提升性能用
主要是配置第三方廠家。有jar包,cache的策略文件(Eh..緩存),配置二級緩存廠商類,開啟二級緩存,二級緩存屬性,配置哪些類適用二級緩存,還需要類的屬性(需要放到文件的最下面),例如只讀。
二級緩存可以管理,可以通過evict清空
3、查詢緩存
查詢緩存存儲的是部分屬性,也叫普通屬性
查詢緩存 會存儲實體對象的id
查詢緩存的生命周期不確定
查詢緩存也需要配置
list():一個session中,第二次查詢不執行sql,說明適用查詢緩存。查詢的是部分字段;兩個session中,同樣適用,說明查詢緩存與session無關