JPA 2.0 Vs Hibernate:緩存方法的差異(二)
原創(chuàng)【51CTO獨(dú)家編譯】在前文中我們把JPA 2.0緩存原理進(jìn)行了簡(jiǎn)單的介紹,本文將為大家介紹一下Hibernate緩存原理。(51CTO編輯特別推薦專(zhuān)題:Hibernate應(yīng)用開(kāi)發(fā)教程)
Hibernate緩存原理
Hibernate也設(shè)有兩個(gè)級(jí)別的緩存:第一級(jí)和第二級(jí)緩存。第一級(jí)緩存是存儲(chǔ)在一個(gè)特定時(shí)域?qū)嵗锏牟樵?xún)結(jié)果,而第二級(jí)緩存則是與SessionFactory實(shí)例相關(guān)聯(lián)。
Hibernate的默認(rèn)使用的第一級(jí)緩存來(lái)存儲(chǔ)每一此運(yùn)算的對(duì)象。 Hibernate的二級(jí)緩存是由SessionFactory支持,根據(jù)訪問(wèn)對(duì)象的應(yīng)用水平來(lái)調(diào)用訪問(wèn)數(shù)據(jù)庫(kù)需要的對(duì)象次數(shù),從而減少了訪問(wèn)次數(shù)。Hibernate的緩存不是通過(guò)儲(chǔ)存存儲(chǔ)對(duì)象本身的實(shí)例來(lái)實(shí)現(xiàn)的。
Hibernate 3.0支持以下四個(gè)開(kāi)源項(xiàng)目的第二級(jí)緩存實(shí)現(xiàn):
◆EHCache (org.hibernate.cache.EhCacheProvider) -- Default
◆OSCache (org.hibernate.cache.OSCacheProvider)
◆SwarmCache (org.hibernate.cache.SwarmCacheProvider)
◆JBoss TreeCache (org.hibernate.cache.TreeCacheProvider)
第二級(jí)緩存可以啟用分別設(shè)置屬性hibernate.cache.use_second_level_cache為正確或錯(cuò)誤。這里是一個(gè)設(shè)置實(shí)例:
- <property name="hibernate.cache.use_second_level_cache">
- true
- </property>
你可以選擇在hibernate.cfg.xml文件里的hibernate.cache.provider_class屬性應(yīng)用進(jìn)行設(shè)置,這里是另一個(gè)設(shè)置實(shí)例:
- <property name="hibernate.cache.provider_class">
- org.hibernate.cache.EhCacheProvider
- </property>
您也可以在類(lèi)級(jí)層或集合層通過(guò)設(shè)置在映射文件作為<cache>組成部分啟用緩存:
- <cache usage="read-only" region="regionName" include="all"/>
這里有一個(gè)在上面的代碼中的組成部分:
◆指定緩存策略的使用情況。
◆指定二級(jí)緩存區(qū)域。
◆包括是一個(gè)可選屬性(一般情況下為默認(rèn)設(shè)置),如果數(shù)據(jù)不常使用可以取消緩存。
您還可以通過(guò)設(shè)置hibernate.cfg.xml文件中的<class-cache>和<collection-cache> 內(nèi)容配置為緩存,在一個(gè)單獨(dú)的EhCache配置文件(ehcache.xml)和項(xiàng)目的根目錄里啟用緩存。
您可以執(zhí)行的緩存是同一組的參數(shù)經(jīng)常使用的查詢(xún)緩存。查詢(xún)緩存設(shè)置為false默認(rèn)情況下,您可以啟用hibernate.cfg.xml文件中加入下面的屬性:
- <property name="hibernate.cache.use_query_cache">true</property>
此查詢(xún)添加StandardQueryCache和UpdateTimestampsCache,分別為查詢(xún)緩存的結(jié)果和最新更新的時(shí)間表。查詢(xún)結(jié)果可以通過(guò)調(diào)用緩存特定的setCacheable查詢(xún)。
Hibernate 3.5緩存
Hibernate 3.5緩存策略與Hibernate的緩存策略是相同的,同時(shí)添加了在Hibernate 3.2和Hashtable沒(méi)有的某些如JBoss Cache 2、JBoss Cache的1.x中緩存策略。
Hibernate 3.5另一個(gè)重大進(jìn)步是Infinispan作為另一個(gè)二級(jí)緩存標(biāo)準(zhǔn)加入。Infinispan是一個(gè)開(kāi)源、可擴(kuò)展的數(shù)據(jù)網(wǎng)格平臺(tái),公開(kāi)了JCache(支持JSR-107)兼容的緩存接口。 Infinispan提供了更高程度的并發(fā)性,因?yàn)镮nfinispan使用一個(gè)專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu),而不是僅僅捆綁到Java,同時(shí)它也支持PHP,Python和Ruby等。
結(jié)論
在本文中,我們比較的JPA 2.0緩存在Hibernate的緩存。通過(guò)引入新的緩存功能,促進(jìn)標(biāo)準(zhǔn)化,JPA的2.0做了很多工作使得開(kāi)發(fā)更容易。不過(guò),因?yàn)樗械墓δ芏加辛撕荛L(zhǎng)時(shí)間的支持,Hibernate是在許多方面遙遙領(lǐng)先。
【編輯推薦】
- JPA 2.0 Vs Hibernate:緩存方法的差異(一)
- JPA與Hibernate的優(yōu)缺點(diǎn)
- JPA重整ORM山河
- 淺析Hibernate EntityManager
- 講解Hibernate核心API
- 簡(jiǎn)述Hibernate ORM是什么