hibernate一級緩存 1.Hibernate一級緩存又稱為“Session緩存”,“會話級緩存”。 2.通過Session從資料庫查詢實體時會把實體在記憶體中存儲起來,下一次查詢同一實體時不再從資料庫獲取,而是從記憶體中獲取,這就是緩存 3.一級緩存的生命周期和Session相同,Session銷 ...
hibernate一級緩存
1.Hibernate一級緩存又稱為“Session緩存”,“會話級緩存”。
2.通過Session從資料庫查詢實體時會把實體在記憶體中存儲起來,下一次查詢同一實體時不再從資料庫獲取,而是從記憶體中獲取,這就是緩存
3.一級緩存的生命周期和Session相同,Session銷毀,它也銷毀。
4.一級緩存中的數據可適用範圍在當前會話之內。
管理一級緩存的API
1.evict(),用於將某個對象從Session的一級緩存中清除。
2.clear(),用於將一級緩存中的所有對象全部清除。
Qurey.list()和Qurey.iterate()
1.Qurey.list()查詢數據,不會從一級緩存中查找,直接向資料庫發送sql語句,將查詢返回的對象保留在緩存中。
2.Qurey.iterate()不從一級緩存中找,直接向資料庫發送sql,查詢id,當需要使用對象其他屬性的時候,先在緩存中根據id查找對象,如果沒有則向資料庫發送sql查詢,因此單獨用該方法查詢會產生N+1問題(即向資料庫發送N+1條語句查詢N個對象的信息)
3.如果存在這種需求:在兩個不同的session都需要對相同的對象進行訪問,通過Qurey.list()需要發送兩條sql語句甚至更多,為了避免可以設置二級緩存,在第一個session中Query.list(),在第二個session中直接通過Qurey.iterate()迭代從二級緩存中獲取
hibernate二級緩存(SessionFactory緩存)
1.添加在hibernate.cfg.xml裡面的配置
<!-- 開啟二級緩存 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- 二級緩存的提供類 在hibernate4.0版本以後我們都是配置這個屬性來指定二級緩存的提供類--> <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對應的表數據只讀取然後緩存)和READ-WIRTE(對錶數據可以讀取也可以更新)
4,一定要註意:hibernate二級緩存的必須是整個對象,如果查詢的只是對象某些屬性,那麼該對象不會被緩存
查詢緩存(SessionFactory級緩存)
1.在上述二級緩存的基礎上繼續配置
2.在hibernate.cfg.xml中添加配置
<property name="hibernate.cache.use_query_cache">true</property>
2.在entity註釋上添加@Cacheable
3.在hql語句後要調用setCacheable(true)方法
4.只有當 HQL 查詢語句完全相同時,連參數設置都要相同,此時查詢緩存才有效
hibernate的三種狀態(transient(瞬時狀態),persistent(持久化狀態)以及detached(離線狀態))
詳情見http://www.cnblogs.com/xiaoluo501395377/p/3380270.html