當前位置:首頁 » 文件管理 » hibernate2級緩存

hibernate2級緩存

發布時間: 2022-03-09 00:42:27

Ⅰ hibernate怎麼實現二級緩存

答案轉載自:

如何在程序里使用二級緩存:
首先在hibernate.cfg.xml開啟二級緩存

Xml代碼

<hibernate-configuration>
<session-factory>

......

<!-- 開啟二級緩存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 啟動"查詢緩存"如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集,必須配置此項-->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 設置二級緩存插件EHCache的Provider類-->
<!-- <property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property> -->
<!-- 二級緩存區域名的前綴 -->
<!--<property name="hibernate.cache.region_prefix">test</property>-->
<!-- 高速緩存提供程序 -->
<property name="hibernate.cache.region.factory_class">
net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>
<!-- Hibernate4以後都封裝到org.hibernate.cache.ehcache.EhCacheRegionFactory -->
<!-- 指定緩存配置文件位置 -->
<!-- <property name="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml
</property> -->
<!-- 強制Hibernate以更人性化的格式將數據存入二級緩存 -->
<property name="hibernate.cache.use_structured_entries">true</property>

<!-- Hibernate將收集有助於性能調節的統計數據 -->
<property name="hibernate.generate_statistics">true</property>

......

</session-factory>
</hibernate-configuration>

然後是ehcache配置(ehcache.xml)
cache參數詳解:
● name:指定區域名
● maxElementsInMemory :緩存在內存中的最大數目
● maxElementsOnDisk:緩存在磁碟上的最大數目
● eternal :設置是否永遠不過期
● overflowToDisk : 硬碟溢出數目
● timeToIdleSeconds :對象處於空閑狀態的最多秒數後銷毀
● timeToLiveSeconds :對象處於緩存狀態的最多秒數後銷毀
● memoryStoreEvictionPolicy:緩存演算法,有LRU(默認)、LFU、LFU

關於緩存演算法,常見有三種:
● LRU:(Least Rencently Used)新來的對象替換掉使用時間算最近很少使用的對象
● LFU:(Least Frequently Used)替換掉按命中率高低算比較低的對象
● LFU:(First In First Out)把最早進入二級緩存的對象替換掉

Xml代碼

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--如果緩存中的對象存儲超過指定的緩存數量的對象存儲的磁碟地址-->
<diskStore path="D:/ehcache"/>

<!-- 默認cache:如果沒有對應的特定區域的緩存,就使用默認緩存 -->
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="false"/>
<!-- 指定區域cache:通過name指定,name對應到Hibernate中的區域名即可-->
<cache name="cn.javass.h3test.model.UserModel"
eternal="false"
maxElementsInMemory="100"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</cache>

</ehcache>

在每個實體的hbm文件中配置cache元素,usage可以是read-only或者是read-write等4種。

Xml代碼

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"" >
<hibernate-mapping>
<class>
<!-- 設置該持久化類的二級緩存並發訪問策略 read-only read-write nonstrict-read-write transactional-->
<class name="cn.java.test.model.User" table="TBL_USER">
<cache usage="read-write"/>
......
</class>
</hibernate-mapping>

也可以用Hibernate註解配置緩存實體類

Java代碼

@Entity
@Table
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements Serializable {
private static final long serialVersionUID = -5121812640999313420L;
private Integer id;
private String name;

......
}

Ⅱ 配置hibernate二級緩存,有幾種方法

19.2.1. 緩存映射(Cache mappings)
類或者集合映射的「<cache>元素」可以有下列形式:

<cache
usage="transactional|read-write|nonstrict-read-write|read-only"
region="RegionName"
include="all|non-lazy"
/> usage(必須)說明了緩存的策略: transactional、 read-write、 nonstrict-read-write或 read-only。

region (可選, 默認為類或者集合的名字(class or collection role name)) 指定第二級緩存的區域名(name of the second level cache region)

include (可選,默認為 all) non-lazy 當屬性級延遲抓取打開時, 標記為lazy="true"的實體的屬性可能無法被緩存

另外(首選?), 你可以在hibernate.cfg.xml中指定<class-cache>和 <collection-cache> 元素。

這里的usage 屬性指明了緩存並發策略(cache concurrency strategy)。

19.2.2. 策略:只讀緩存(Strategy: read only)
如果你的應用程序只需讀取一個持久化類的實例,而無需對其修改, 那麼就可以對其進行只讀 緩存。這是最簡單,也是實用性最好的方法。甚至在集群中,它也能完美地運作。

<class name="eg.Immutable" mutable="false">
<cache usage="read-only"/>
....
</class>19.2.3. 策略:讀/寫緩存(Strategy: read/write)
如果應用程序需要更新數據,那麼使用讀/寫緩存 比較合適。 如果應用程序要求「序列化事務」的隔離級別(serializable transaction isolation level),那麼就決不能使用這種緩存策略。 如果在JTA環境中使用緩存,你必須指定hibernate.transaction.manager_lookup_class屬性的值, 通過它,Hibernate才能知道該應用程序中JTA的TransactionManager的具體策略。 在其它環境中,你必須保證在Session.close()、或Session.disconnect()調用前, 整個事務已經結束。 如果你想在集群環境中使用此策略,你必須保證底層的緩存實現支持鎖定(locking)。Hibernate內置的緩存策略並不支持鎖定功能。

<class name="eg.Cat" .... >
<cache usage="read-write"/>
....
<set name="kittens" ... >
<cache usage="read-write"/>
....
</set>
</class>

Ⅲ hibernate緩存機制的二級緩存

Hibernate提供了兩級緩存,第一級是Session的緩存。由於Session對象的生命周期通常對應一個資料庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。
第二級緩存是一個可插拔的的緩存插件,它是由SessionFactory負責管理。由於SessionFactory對象的生命周期和應用程序的整個過程對應,因此第二級緩存是進程范圍或者集群范圍的緩存。這個緩存中存放的對象的鬆散數據。第二級對象有可能出現並發問題,因此需要採用適當的並發訪問策略,該策略為被緩存的數據提供了事務隔離級別。緩存適配器用於把具體的緩存實現軟體與Hibernate集成。第二級緩存是可選的,可以在每個類或每個集合的粒度上配置第二級緩存。 適合存放到第二級緩存中的數據
1 很少被修改的數據
2 不是很重要的數據,允許出現偶爾並發的數據
3 不會被並發訪問的數據
4 參考數據
不適合存放到第二級緩存的數據
1 經常被修改的數據
2 財務數據,絕對不允許出現並發
3 與其他應用共享的數據。 1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的數據對象。
2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存。
4) 刪除、更新、增加數據的時候,同時更新緩存。
Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩存。
Hibernate的Query緩存策略的過程如下:
1) Hibernate首先根據這些信息組成一個Query Key,Query Key包括條件查詢的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個數maxRows),等。
2) Hibernate根據這個Query Key到Query緩存中查找對應的結果列表。如果存在,那麼返回這個結果列表;如果不存在,查詢資料庫,獲取結果列表,把整個結果列表根據Query Key放入到Query緩存中。
3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發生修改、刪除、增加等操作,這些相關的Query Key都要從緩存中清空。

Ⅳ Hibernate二級緩存的問題

並發訪問就是同時訪問的意思
例如a,b兩個人,都去看c這個數據
a,b同時讀取,這就是並發
a讀取完b再讀取,不是並發

Ⅳ 什麼是hibernate中的二級緩存

第一級別的緩存是Session級別的緩存,是屬於事務范圍的緩存,由Hibernate管理,一般無需進行干預。第二級別的緩存是SessionFactory級別的緩存,是屬於進程范圍的緩存。


二級緩存也分為了兩種

內置緩存:Hibernate自帶的,不可卸載,通常在Hibernate的初始化階段,Hibernate會把映射元數據和預定義的SQL語句放置到SessionFactory的緩存中。該內置緩存是只讀的。

外置緩存:通常說的二級緩存也就是外置緩存,在默認情況下SessionFactory不會啟用這個緩存插件,外置緩存中的數據是資料庫數據的復制,外置緩存的物理介質可以是內存或者硬碟。

hibernate二級緩存的結構


2.並發訪問策略

transactional

(事務型)

僅在受管理的環境中適用

提供Repeatable Read事務隔離級別

適用經常被讀,很少修改的數據

可以防止臟讀和不可重復讀的並發問題

緩存支持事務,發生異常的時候,緩存也能夠回滾

read-write

(讀寫型)

提供Read Committed事務隔離級別

在非集群的環境中適用

適用經常被讀,很少修改的數據

可以防止臟讀

更新緩存的時候會鎖定緩存中的數據

nonstrict-read-write

(非嚴格讀寫型)

適用極少被修改,偶爾允許臟讀的數據(兩個事務同時修改數據的情況很少見)

不保證緩存和資料庫中數據的一致性

為緩存數據設置很短的過期時間,從而盡量避免臟讀

不鎖定緩存中的數據

read-only

(只讀型)

適用從來不會被修改的數據(如參考數據)

在此模式下,如果對數據進行更新操作,會有異常

事務隔離級別低,並發性能高

在集群環境中也能完美運作

分析:通過上述表格分析如下

適合放入二級緩存中數據

很少被修改

不是很重要的數據,允許出現偶爾的並發問題

不適合放入二級緩存中的數據

經常被修改

財務數據,絕對不允許出現並發問題

與其他應用數據共享的數據


Ⅵ Hibernate的一級緩存與二級緩存的區別

一級緩存就是Session級別的緩存,一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩存中,如果短時間內這個session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級緩存中拿,而不會再去連資料庫,取數據。

二級緩存就是SessionFactory級別的緩存,顧名思義,就是查詢的時候會把查詢結果緩存到二級緩存中,如果同一個sessionFactory創建的某個session執行了相同的操作,hibernate就會從二級緩存中拿結果,而不會再去連接資料庫。

Ⅶ 什麼事Hibernate二級緩存

只需要查一次資料庫,在次操作數據不用去查詢了,它會首先找緩存,看看有沒有,如果有就直接用,沒有的時候在去查!

Ⅷ 什麼是hibernate二級緩存

在向大家詳細介紹Hibernate二級緩存之前,首先讓大家了解下一級緩存,然後全面介紹Hibernate二級緩存。

Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務范圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程范圍或群集范圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態載入和卸載。 Hibernate還為查詢結果提供了一個查詢緩存,它依賴於第二級緩存。

Ⅸ Hibernate 二級緩存的作用

true
org.hibernate.cache.ehcacheprovider
前一句是打開二級緩存,後一句是啟用第三方緩存產品(可改變,上面eache是hibernate官方默認的第三方緩存產品)
緩存是否實用,要看你的需求,
如果你的系統,瀏覽的人數比較多,但是增刪的比較少,緩存的功勞非常大
如果你的系統即時性非常強,那麼緩存的命中率就比較低,同時更新數據時,hibernate需要額外提供資源維護緩存與數據的一致

Ⅹ hibernate二級緩存有哪些方法

二級緩存是獨立於Hibernate的軟體部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接著需要配置該緩存產品自己的配置文件,最後要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能負責緩存一個資料庫中的數據,當使用Hibernate 的二級緩存後,注意不要有其他的應用或SessionFactory來更改當前資料庫中的數據,這樣緩存的數據就會與資料庫中的實際數據不一致。

熱點內容
BMF伺服器的系統服務怎麼關 發布:2025-01-17 05:50:29 瀏覽:876
免刷安卓系統怎麼進入usb調試 發布:2025-01-17 05:48:21 瀏覽:837
資料庫的三層架構 發布:2025-01-17 05:17:36 瀏覽:149
雲頂之弈有人開腳本怎麼舉報 發布:2025-01-17 05:16:59 瀏覽:682
sql包含數字 發布:2025-01-17 05:11:56 瀏覽:292
密碼忘記了怎麼查看 發布:2025-01-17 05:02:30 瀏覽:682
腳本執行sql語句 發布:2025-01-17 04:47:51 瀏覽:702
結構體訪問成員變數 發布:2025-01-17 04:32:09 瀏覽:31
熱點緩存 發布:2025-01-17 04:30:07 瀏覽:523
砂的細度演算法 發布:2025-01-17 04:22:58 瀏覽:981