1. 程式人生 > >Hibernate L2 Cache 之 Ignite

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中Sessionget和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: