hibernate缓存机制
hibernate一級緩存
1.Hibernate一級緩存又稱為“Session緩存”,“會(huì)話級緩存”。
2.通過Session從數(shù)據(jù)庫查詢實(shí)體時(shí)會(huì)把實(shí)體在內(nèi)存中存儲(chǔ)起來,下一次查詢同一實(shí)體時(shí)不再從數(shù)據(jù)庫獲取,而是從內(nèi)存中獲取,這就是緩存
3.一級緩存的生命周期和Session相同,Session銷毀,它也銷毀。
4.一級緩存中的數(shù)據(jù)可適用范圍在當(dāng)前會(huì)話之內(nèi)。
?
管理一級緩存的API
1.evict(),用于將某個(gè)對象從Session的一級緩存中清除。
2.clear(),用于將一級緩存中的所有對象全部清除。
?
Qurey.list()和Qurey.iterate()
1.Qurey.list()查詢數(shù)據(jù),不會(huì)從一級緩存中查找,直接向數(shù)據(jù)庫發(fā)送sql語句,將查詢返回的對象保留在緩存中。
2.Qurey.iterate()不從一級緩存中找,直接向數(shù)據(jù)庫發(fā)送sql,查詢id,當(dāng)需要使用對象其他屬性的時(shí)候,先在緩存中根據(jù)id查找對象,如果沒有則向數(shù)據(jù)庫發(fā)送sql查詢,因此單獨(dú)用該方法查詢會(huì)產(chǎn)生N+1問題(即向數(shù)據(jù)庫發(fā)送N+1條語句查詢N個(gè)對象的信息)
3.如果存在這種需求:在兩個(gè)不同的session都需要對相同的對象進(jìn)行訪問,通過Qurey.list()需要發(fā)送兩條sql語句甚至更多,為了避免可以設(shè)置二級緩存,在第一個(gè)session中Query.list(),在第二個(gè)session中直接通過Qurey.iterate()迭代從二級緩存中獲取
?
hibernate二級緩存(SessionFactory緩存)
1.添加在hibernate.cfg.xml里面的配置
<!-- 開啟二級緩存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 二級緩存的提供類 在hibernate4.0版本以后我們都是配置這個(gè)屬性來指定二級緩存的提供類--><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 二級緩存配置文件的位置 --><property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>2.配置ehcache.xml具體見http://www.cnblogs.com/kundeg/p/7172428.html?
3.通過注釋配置entity,在類前加上@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
?CacheConcurrencyStrategy屬性值常見的有READ_ONLY(對該entity對應(yīng)的表數(shù)據(jù)只讀取然后緩存)和READ-WIRTE(對表數(shù)據(jù)可以讀取也可以更新)
4,一定要注意:hibernate二級緩存的必須是整個(gè)對象,如果查詢的只是對象某些屬性,那么該對象不會(huì)被緩存
?
查詢緩存(SessionFactory級緩存)?
1.在上述二級緩存的基礎(chǔ)上繼續(xù)配置
2.在hibernate.cfg.xml中添加配置
<property name="hibernate.cache.use_query_cache">true</property>2.在entity注釋上添加@Cacheable
3.在hql語句后要調(diào)用setCacheable(true)方法
4.只有當(dāng) HQL 查詢語句完全相同時(shí),連參數(shù)設(shè)置都要相同,此時(shí)查詢緩存才有效
?
hibernate的三種狀態(tài)(transient(瞬時(shí)狀態(tài)),persistent(持久化狀態(tài))以及detached(離線狀態(tài)))
?詳情見http://www.cnblogs.com/xiaoluo501395377/p/3380270.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/kundeg/p/7173521.html
總結(jié)
以上是生活随笔為你收集整理的hibernate缓存机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外地户籍单身可以在上海办退休为什么不能购
- 下一篇: Mac下Homebrew的图形化界面工具