Hibernate L2 Cache 之 Ignite
1.概述
啟動記憶體資料結構可以用作Hibernate二級快取(或L2快取),它可以極大地加速應用程式的持久層。
Hibernate是一個眾所周知的、廣泛使用的物件關係對映框架(ORM)。與SQL資料庫互動時,它會快取檢索到的資料,以最小化昂貴的資料庫請求。
所有使用Hibernate資料庫對映的物件都是在一個會話中完成的,通常繫結到一個工作執行緒或一個Web會話。預設情況下,Hibernate只使用每個會話(L1)快取,因此,在一個會話中快取的物件在另一個會話中是不可見的。但是,可以使用全域性二級(L2)快取,其中快取物件在所有使用相同L2快取配置的會話中都可以看到。這通常會帶來更大的效能增益,因為每一個新建立的會話都可以充分利用L2快取記憶體中已經存在的資料(它比任何session-local L1快取更重要)。 儘管L1快取始終是由Hibernate內部的Hibernate來啟用和實現的,但是L2快取是可選的,並且可以有多個可插接實現。ignite可以很容易作為一個L2快取的實現而插入進其中,可以在所有訪問模式中使用(READ_ONLY, READ_WRITE, NONSTRICT_READ_WRITE和TRANSACTIONAL),支援多種相關特性: >快取到記憶體和磁碟,以及非堆記憶體。 >快取事務,使事務模式成為可能。 >叢集,有兩種不同的複製模式:複製和分割槽 要開始使用GridGain作為Hibernate L2快取,您需要執行三個簡單的步驟: >將ignite的庫新增到應用程式的類路徑中。 >啟用L2快取並指定在L2快取配置中啟用實現類 >為L2快取區域配置ignite快取,並啟動嵌入的ignite節點(以及,可選地,外部ignite節點)。 在下一節中,我們將更詳細地討論這些步驟。
2.L2 Cache Configuration
為了將記憶體中的資料結構配置為Hibernate L2快取,無需對現有Hibernate程式碼進行任何更改,您需要: 1.根據依賴於是否使用Hibernate5或Hibernate4,將ignite-hibernate_5.1或ignite-hibernate_4.2模組新增到您的專案。或者,如果您從命令列啟動Apache ignite節點,您可以複製JAR檔案從{apache_ignite_relese}/libs/optional到{apache_ignite_relese}/libs資料夾中。 2.配置Hibernate本身使用ignite作為L2快取。 3.適當地配置ignite快取。
2.1 Maven Configuration
要新增Apache點燃Hibernate整合到您的專案,請新增以下依賴項到您的pom。xml檔案:
//hibernate5
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-hibernate_5.1</artifactId>
<version>${ignite.version}</version>
</dependency>
2.2 Hibernate Configuration Example
用於L2快取的典型Hibernate配置如下所示:
<hibernate-configuration>
<session-factory>
...
<!-- Enable L2 cache. -->
<property name="cache.use_second_level_cache">true</property>
<!-- Generate L2 cache statistics. -->
<property name="generate_statistics">true</property>
<!-- Specify Ignite as L2 cache provider. -->
<property name="cache.region.factory_class">org.apache.ignite.cache.hibernate.HibernateRegionFactory</property>
<!-- Specify the name of the grid, that will be used for second level caching. -->
<property name="org.apache.ignite.hibernate.ignite_instance_name">hibernate-grid</property>
<!-- Set default L2 cache access type. -->
<property name="org.apache.ignite.hibernate.default_access_type">READ_ONLY</property>
<!-- Specify the entity classes for mapping. -->
<mapping class="com.mycompany.MyEntity1"/>
<mapping class="com.mycompany.MyEntity2"/>
<!-- Per-class L2 cache settings. -->
<class-cache class="com.mycompany.MyEntity1" usage="read-only"/>
<class-cache class="com.mycompany.MyEntity2" usage="read-only"/>
<collection-cache collection="com.mycompany.MyEntity1.children" usage="read-only"/>
...
</session-factory>
</hibernate-configuration>
這裡,我們做以下工作:
>啟用L2快取(也可以選擇L2快取統計資料生成)
>指定點火為L2快取實現。
>指定快取網格的名稱(應該對應於ignite配置中的一個)。
>為每個類指定實體類和配置快取(對應於在ignite中配置的快取區域)。
2.3 Ignite Configuration Example
Hibernate L2快取的一個典型的點火配置如下:
<!-- Basic configuration for atomic cache. -->
<bean id="atomic-cache" class="org.apache.ignite.configuration.CacheConfiguration" abstract="true">
<property name="cacheMode" value="PARTITIONED"/>
<property name="atomicityMode" value="ATOMIC"/>
<property name="writeSynchronizationMode" value="FULL_SYNC"/>
</bean>
<!-- Basic configuration for transactional cache. -->
<bean id="transactional-cache" class="org.apache.ignite.configuration.CacheConfiguration" abstract="true">
<property name="cacheMode" value="PARTITIONED"/>
<property name="atomicityMode" value="TRANSACTIONAL"/>
<property name="writeSynchronizationMode" value="FULL_SYNC"/>
</bean>
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<!--
Specify the name of the caching grid (should correspond to the
one in Hibernate configuration).
-->
<property name="igniteInstanceName" value="hibernate-grid"/>
...
<!--
Specify cache configuration for each L2 cache region (which corresponds
to a full class name or a full association name).
-->
<property name="cacheConfiguration">
<list>
<!--
Configurations for entity caches.
-->
<bean parent="transactional-cache">
<property name="name" value="com.mycompany.MyEntity1"/>
</bean>
<bean parent="transactional-cache">
<property name="name" value="com.mycompany.MyEntity2"/>
</bean>
<bean parent="transactional-cache">
<property name="name" value="com.mycompany.MyEntity1.children"/>
</bean>
<!-- Configuration for update timestamps cache. -->
<bean parent="atomic-cache">
<property name="name" value="org.hibernate.cache.spi.UpdateTimestampsCache"/>
</bean>
<!-- Configuration for query result cache. -->
<bean parent="atomic-cache">
<property name="name" value="org.hibernate.cache.internal.StandardQueryCache"/>
</bean>
</list>
</property>
...
</bean>
這裡,我們為每個L2快取區域指定快取配置:
>我們使用PARTITIONED 快取來分隔快取節點之間的資料。另一種可能的策略是啟用REPLICATED 模式,從而在所有快取節點之間複製一個完整的資料集。有關更多資訊,請參見快取分佈模型。
>我們指定對應於L2快取區域名稱的快取名稱(一個完整的類名或一個完整的關聯名稱)。
>我們使用TRANSACTIONAL 原子性模式來利用快取事務。
>我們啟用FULL_SYNC與備份節點保持完全同步。
此外,我們指定快取用於更新時間戳,這可能是原子性的,以獲得更好的效能。
在配置了ignite快取節點之後,我們可以從程式碼下面的方式開始:
Ignition.start("my-config-folder/my-ignite-configuration.xml");
執行上面的行之後,內部ignite節點啟動,並且準備好要快取的資料。我們還可以通過在控制檯執行以下命令來啟動其他獨立節點:
$IGNITE_HOME/bin/ignite.sh my-config-folder/my-ignite-configuration.xml
對於Windows,在同一個資料夾中使用.bat指令碼。
PS:節點也可以在其他主機上啟動,形成分散式快取叢集。確保在GridGain配置檔案中指定正確的網路設定。
3.Query Cache
除了L2快取之外,Hibernate還提供了一個查詢快取。這個快取將查詢的結果(HQL或Criteria)儲存為給定的引數集,因此,當您使用相同的引數集重複查詢時,它會在不訪問資料庫的情況下對快取進行訪問。
如果有許多查詢,查詢快取可能會有用,這些查詢可能重複使用相同的引數值。就像L2快取一樣,Hibernate依賴於一個3 - rd的派對快取實現,並點燃記憶體資料結構
PS:考慮直接使用Apache Ignite SQL Grid,它應該比通過Hibernate呼叫更快地執行
4. Query Cache Configuration
以上的配置資訊完全適用於查詢快取,但是需要進行一些額外的配置和程式碼更改。
4.1 Hibernate Configuration
為了在Hibernate中啟用查詢快取,您只需要在配置檔案中新增一條額外的行:
<!-- Enable query cache. -->
<property name="cache.use_query_cache">true</property>
然而,需要進行程式碼修改:對於想要快取的每個查詢,都應該通過setCacheable(true)啟用cacheable :
Session ses = ...;
// Create Criteria query.
Criteria criteria = ses.createCriteria(cls);
// Enable cacheable flag.
criteria.setCacheable(true);
...
完成此操作後,將快取查詢結果。
4.2 Ignite Configuration
為了在ignite中使Hibernate查詢快取可用,您需要指定一個附加的快取配置:
<property name="cacheConfiguration">
<list>
...
<!-- Query cache (refers to atomic cache defined in above example). -->
<bean parent="atomic-cache">
<property name="name" value="org.hibernate.cache.internal.StandardQueryCache"/>
</bean>
</list>
</property>
注意,快取是為更好的效能而進行的。
5. 樣例
https://github.com/apache/ignite/blob/master/examples/src/main/java-lgpl/org/apache/ignite/examples/datagrid/hibernate/HibernateL2CacheExample.java
高興了吧~~
相關推薦
Hibernate L2 Cache 之 Ignite
1.概述 啟動記憶體資料結構可以用作Hibernate二級快取(或L2快取),它可以極大地加速應用程式的持久層。 Hibernate是一個眾所周知的、廣泛使用的物件關係對映框架(ORM)。與SQL資料庫互動時,它會快取檢索到的資料,以最小化昂貴的資料庫請求。
Hibernate快取體系之查詢快取(query cache),以及list和iterate方法的區別
Hibernate框架提供了Session.load()和Session.get()方法,用來根據實體物件的主鍵值從資料庫中查詢對應記錄。針對load和get方法,hibernate提供了一級快取和二級快取的支援,提高查詢效率,具體可以參考我的部落格:通過測試
Spring+Hibernate+Struts2整合之實現登錄功能
else ber mit generate public rac err web field 軟件152 劉安民 前端代碼: <form id="loginForm" action="${ pageContext.request.contextPath }/us
Hibernate中Session之get和load方法的真正區別
repl .get user href 獲得 tno lose 錯誤 ftw 最近在學習SHH框架中的hibernate,對Session的get和load方法,有點混不清楚,不知道區別在哪,或者對它們的區別感觸不深。所以百度了一下,結果問題來了。百度的結果和實際測試
學習hibernate出現錯誤--之二(方言)
pda data cells bird nbsp 版本問題 inno 提高 語言 最近在學習hibernate,其中關於錯誤的問題真是一頭大,各種各樣的奇葩錯誤層出不窮,簡直是受不了了。 用hibernate操作數據庫,在使用hibernate進行把持久
Hibernate框架學習之註解配置關系映射
target 列名 獲取 fonts 查詢 conn unique strategy code ?????上篇文章我們通過註解對映射了單個實體類,但是具體項目中往往實體類之間又是相互關聯的,本篇文章就是從實體類之間存在的不同關聯角度,具體學習下如何映射他們之間的關聯,主要涉
hibernate框架學習之持久化對象OID
進行 主鍵 color java對象 一定的 使用 安全 查看 內存 持久化對象唯一標識——OID 1)數據庫中使用主鍵可以區分兩個對象是否相同2)Java語言中使用對象的內存地址區分對象是否相同3)Hibernate中使用OID區分對象是否相同Hibernate認為每一個
hibernate框架學習之使用SQLQuery查詢數據
sql語句 推薦 語法 list() 結果 字符 數據封裝 span 查詢 SQLQuery對象的獲取 Hibernate支持使用原生SQL語句進行查詢,通過session對象獲得SQLQuery對象進行,需要傳入SQL語句 SQLQuery createSQLQuer
hibernate框架學習之核心API
需要 action pan 獨立 configure 出現 定義 ets 屬性 ConfigurationSessionFactorySessionTransactionQueryCriteria Configuration Configuration對象用於封裝Hiber
hibernate框架學習之核心配置文件
encoding driver user pool prope jdbc nat false form hibernate.cfg.xml <?xml version=‘1.0‘ encoding=‘utf-8‘?> <!DOCTYPE hibernat
hibernate框架學習之數據模型-POJO
標識 生成 基本數據類型 自動生成 構造 開發 避免 如果 修飾 Hibernate數據模型用於封裝數據,開發時候需要遵從如下規範:1)提供公共無參的構造方法(可使用自動生成的)如果使用投影技術,一定要顯式聲明公共無參的構造方法2)提供一個標識屬性,作為對象的主鍵,映射數據
hibernate框架學習之對象狀態
color 如何 由於 創建 技術分享 不同的 有一個 get ges Hibernate對象共有三種狀態瞬時狀態:瞬時對象持久化狀態:持久化對象托管狀態:托管對象瞬時對象(Transient Object),簡稱TO瞬時對象指的是應用程序創建出來的對象,並且未受到Hibe
hibernate框架學習之數據查詢(QBC)helloworld
string bsp eal ssi alink ger -- sim ali package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import o
hibernate框架學習之一級緩存
commit 任務 功能區 出了 運行 發生 快照 class 可以關閉 l緩存是存儲數據的臨時空間,減少從數據庫中查詢數據的次數lHibernate中提供有兩種緩存機制?一級緩存(Hibernate自身攜帶)?二級緩存(使用外部技術)lHibernate的一級緩存即Hib
hibernate框架學習之數據查詢(HQL)
-c skill fir 方式 行數據 del 表數據 ber 描述 lHibernate共提供5種查詢方式?OID數據查詢方式?HQL數據查詢方式?QBC數據查詢方式?本地SQL查詢方式?OGN數據查詢方式OID數據查詢方式l前提:已經獲取到了對象的OIDl查詢:基於OI
hibernate框架學習之數據查詢(HQL)helloworld
args 配置 老師 框架 sets 測試 () eat med package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Ses
hibernate框架學習之多表查詢helloworld
nat student 查詢 get span bsp object from ber package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hi
L1 Cache, L2 Cache讀取命中率與時鐘周期計算
cpu href blog pan www intel 為知 tag lse CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率
Hibernate知識點複習之四
Hibernate知識點複習之四 Hibernate的檢索 檢索方式分類:物件圖導航檢索方式,OID檢索方式,HQL檢索方式,QBC檢索方式,SQL檢索方式 1 物件圖導航檢索方式: 根據已載入的物件,導航到他的關聯物件,它是利用類與類的關係來檢索物件,如要查詢一個聯絡人對應的客戶, 就可以由聯絡人物
hibernate使用generated之生成的預設屬性值
關於generated=""的適用值說明: never(預設):標明此屬性值不是從資料庫中生成, 也就是根本不用重新整理實體類了。 insert:標明此屬性值在insert的時候生成,但是不會在隨後的update時重新生成。也就是隻在insert情況下才會重新整理實體類。 always: