Hibernate緩存(三)

轉載自:http://aumy2008.blogbus.com/logs/41093167.html

七、哪些方法支持緩存

*get()
*load()
*iterate()  (查詢實體對象)

save()

查詢緩存只對query.list()起作用

 

 

一級緩存測試:

1.Load測試: 在同一個session中發出兩次load查詢(1)

2.Get測試: 在同一個session中發出兩次get查詢(1)

3.iterate測試: 在同一個session中發出兩次iterator查詢(1(id)+N,1(id))

4.Iterate查詢屬性測試: 同一個session中發出兩次查詢屬性(2次,iterate查詢普通屬性,一級緩存不會緩存,所以會發出sql)

5.同一個session中先save,再發出load查詢save過的數據--save是使用緩存的

6.同一個session中先調用load查詢,然後執行sessio.clear()或session.evict(),再調用load查詢(2次)

       sessio.clear()或session.evict()可以管理一級緩存,一級緩存無法取消,但可以管理. 上面的語句都會發出sql 因爲一級緩存中的實體被清除了

7.向數據庫中批量加入1000條數據

       //每一定條數據就強制session將數據持久化,同時清除緩存,避免大量數據造成內存溢出

 

開啓二級緩存測試:

1.開啓兩個session中發出兩次load查詢(get與load一樣,1次),

2.開啓兩個session,分別調用load,再使用sessionFactory清楚二級緩存(2次)

3.一級緩存和二級緩存的交互

       session.setCacheMode(CacheMode.GET);    //設置成 只是從二級緩存裏讀,不向二級緩存裏寫數據 (2)

       session.setCacheMode(CacheMode.PUT);  //設置成只是向二級緩存裏寫數據,不讀數據 (2次)

 

開啓hibernate查詢緩存測試:

1.  開啓查詢緩存,關閉二級緩存,開啓一個session,分別調用query.list  (查詢屬性)(1次)

2.  開啓查詢緩存,關閉二級緩存,開啓兩個session,分別調用query.list  (查詢屬性)

(1次)第二次沒有去查詢數據庫,因爲查詢緩存生命週期與session生命週期無關

3.  開啓查詢緩存,關閉二級緩存,開啓兩個session,分別調用query.iterate (查詢屬性)

(2次)第二去查詢數據庫,因爲查詢緩存只對query.list()起作用,對query.iterate()不起作用,也就是說query.iterate()不使用查詢緩存

4.  關閉查詢緩存,關閉二級緩存,開啓兩個session,分別調用query.list (查詢實體對象)      第二去查詢數據庫,因爲list默認每次都會發出查詢sql

5.  開啓查詢緩存,關閉二級緩存,開啓兩個session,分別調用query.list (查詢實體對象)      第二去查詢數據庫時,會發出N條sql語句,因爲開啓了查詢緩存,關閉了二級緩存,那麼查詢緩存會緩存實體對象的id,所以hibernate會根據實體對象的id去查詢相應的實體,如果緩存中不存在相應的實體,那麼將發出根據實體id查詢的sql語句,否則不會發出sql,使用緩存中的數據

6.  開啓查詢緩存,開啓二級緩存,開啓兩個session,分別調用query.list (查詢實體對象)      第二不會發出sql,因爲開啓了二級緩存和查詢緩存,查詢緩存緩存了實體對象的id列表,hibernate會根據實體對象的id列表到二級緩存中取得相應的數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章