?
轉(zhuǎn)載:
http://raymondhekk.iteye.com/blog/260432#bc2264843
?
?
摘要
:Oracle Coherence是一個(gè)企業(yè)級(jí)的分布式集群緩存框架。具有自管理,自恢復(fù),高可用性,高擴(kuò)展性等優(yōu)良特點(diǎn),在電信BOSS等項(xiàng)目中有很大的應(yīng)用價(jià)值。本文對(duì)它的特點(diǎn),架構(gòu),基本使用方法,JMX管理,調(diào)優(yōu)等進(jìn)行簡(jiǎn)要但快捷的介紹,并對(duì)于Hibernate的集成過(guò)程進(jìn)行說(shuō)明,為BOSS,CMP等移動(dòng)項(xiàng)目提供一個(gè)的參考。
關(guān)鍵詞
:分布式緩存 Coherence
網(wǎng)上除了官方用戶指南,關(guān)于Coherence的介紹文章資料很少,因此總結(jié)出此文,從原理到快速指南和基本最佳實(shí)踐,希望對(duì)需要的人提供一個(gè)參考。
1 Coherence 概述
1.1 Coherence是什么
Oracle官方網(wǎng)站的描述是:Coherence 在可靠的、高度可伸縮的對(duì)等集群協(xié)議之上提供了復(fù)制的、分布式的(分區(qū)的)數(shù)據(jù)管理和緩存服務(wù)。Coherence 不存在單點(diǎn)故障,當(dāng)某臺(tái)服務(wù)器無(wú)法操作或從網(wǎng)絡(luò)斷開(kāi)時(shí),它可以自動(dòng)且透明地進(jìn)行故障切換并重新分布它的集群化數(shù)據(jù)管理服務(wù)。當(dāng)新服務(wù)器加入或故障服務(wù)器重 啟時(shí),它會(huì)自動(dòng)加入集群,Coherence 會(huì)將服務(wù)切回到該服務(wù)器,透明地重新分布集群負(fù)載。Coherence 包含網(wǎng)絡(luò)級(jí)的容錯(cuò)特性和透明的軟重啟功能,以支持服務(wù)器自我修復(fù)。
----來(lái)自O(shè)racle Coherence 專區(qū)
http://www.oracle.com/technology/global/cn/products/coherence/index.html
一個(gè)典型的Hibernate應(yīng)用 + Coherence集群如下圖所示:
1.2 Coherence的特點(diǎn)
1.2.1 分布式集群緩存
Coherence是一個(gè)分布式的緩存方案,并且通過(guò)集群為應(yīng)用提供強(qiáng)大的緩存后備支持。Coherence主要是內(nèi)存緩存,即存儲(chǔ)區(qū)域主要在內(nèi)存當(dāng)中。
與一般的分布式緩存方案如JBossCache, Memcache 等相同,分布式緩存的價(jià)值基于網(wǎng)絡(luò)IO性能高于DB查詢的磁盤(pán)IO性能這樣一個(gè)特點(diǎn)。
Coherence所有的設(shè)計(jì)都是基于多個(gè)(可以是非常多)的JVM,很多Coherence的測(cè)試都是使用幾十甚至上百個(gè)節(jié)點(diǎn)來(lái)進(jìn)行的。
下圖展示了一個(gè)典型的WAS項(xiàng)目架構(gòu):WAS集群 + Near型Coherence集群架構(gòu)。對(duì)于大型Web2.0網(wǎng)站(PHP或其他),集成Coherence也是類似的。
1.2.2自管理
Coherence使用的網(wǎng)絡(luò)協(xié)議是TCMP ,是對(duì)UDP,TCP/IP的組合使用。Coherence能將啟動(dòng)的實(shí)例節(jié)點(diǎn)(Node)自動(dòng)組成為集群(Cluster)。在一個(gè)局域網(wǎng)環(huán)境中,通過(guò)多播(Multicast)機(jī)制,第1個(gè)啟動(dòng)的Node能自動(dòng)發(fā)現(xiàn)后啟動(dòng)的Node,第1,2個(gè)Node同樣能發(fā)現(xiàn)之后啟動(dòng)的其他Node,依次類推,自動(dòng)組成集群; 并且也能自動(dòng)檢測(cè)到死亡節(jié)點(diǎn)。集群各節(jié)點(diǎn)間通過(guò)單播(Unicast)機(jī)制進(jìn)行數(shù)據(jù)復(fù)制,同步及發(fā)送通知消息。
Coherence集群以統(tǒng)一的邏輯試圖對(duì)外提供緩存的讀寫(xiě)接口,看起來(lái)使用Coherence Client就像在使用一個(gè)緩存一樣。
1.2.3 自動(dòng)容錯(cuò)和恢復(fù)
基于自管理的特點(diǎn),一個(gè)Node掛掉后,集群能自動(dòng)監(jiān)測(cè)到,并做好死亡節(jié)點(diǎn)的數(shù)據(jù)恢復(fù)機(jī)制,客戶端依然能正確的讀出在死亡節(jié)點(diǎn)上存儲(chǔ)的數(shù)據(jù),容錯(cuò)和恢復(fù)對(duì)客戶端來(lái)說(shuō)是透明的。
1.2.4 分區(qū)緩存(Partitioned Cache)
這是Coherence與眾不同的地方。一般集群如:JBossCache, Websphere 集群等,每個(gè)Node都有數(shù)據(jù)的完整拷貝,Node間通過(guò)復(fù)制來(lái)實(shí)現(xiàn)數(shù)據(jù)同步和一致性,一般來(lái)說(shuō)采用全復(fù)制模式,即一份數(shù)據(jù)在各節(jié)點(diǎn)上都有一份拷貝。這種模式下,節(jié)點(diǎn)要存儲(chǔ)了較多的數(shù)據(jù),同步復(fù)制時(shí)比較消耗網(wǎng)絡(luò)帶寬。
而Coherence的分區(qū)緩存只將一個(gè)Node上的數(shù)據(jù)在另一節(jié)點(diǎn)上做1個(gè)備份,有效降低復(fù)制的消耗好時(shí)間,并節(jié)省內(nèi)存總需求,只需復(fù)制模式的1/N (N為緩存節(jié)點(diǎn)個(gè)數(shù))。
1.2.5 線性擴(kuò)展
假如你的Coherence集群已經(jīng)有4個(gè)Node,當(dāng)系統(tǒng)數(shù)據(jù)量過(guò)大引起Cache容量滿員,導(dǎo)致緩存性能下降時(shí),可以通過(guò)啟動(dòng)新的Node來(lái)擴(kuò)容,改善集群的性能。
這一點(diǎn)也是源自分區(qū)緩存技術(shù),集群有N個(gè)Node,每個(gè)Node只存放1/N的數(shù)據(jù),這種設(shè)計(jì)讓Coherence能夠處理非常多的數(shù)據(jù),只需要通過(guò)增加節(jié)點(diǎn)的數(shù)量,就可以處理更多的數(shù)據(jù)。
下圖為例,當(dāng)兩臺(tái)機(jī)器,4個(gè)存儲(chǔ)Node不夠用時(shí),通過(guò)新增機(jī)器,新增Node實(shí)例即可自動(dòng)加入集群,提升Coherence緩存性能。?
線性擴(kuò)展更重要體現(xiàn)在性能上,下圖展示了,Coherence集群通過(guò)增加機(jī)器,增加Node實(shí)例使得交易耗時(shí)大幅降低,而且隨著集群規(guī)模呈線性下降。
1.2.6易用性
雖然上述特點(diǎn)看起來(lái)似乎很復(fù)雜,但那都是Coherence自己內(nèi)部的事兒。對(duì)于客戶端來(lái)說(shuō),與最簡(jiǎn)單的Map 操作一樣,僅僅是 put(key,value), get(key) 等。
NamedCache cache = CacheFactory.getCache("dist-cache");
cache.put(key, value);
Object value = cache.get(key);
正是基于以上技術(shù)和特點(diǎn),Coherence成為一個(gè)高可用性,高擴(kuò)展性,高性能但使用非常簡(jiǎn)單的網(wǎng)格型(Data Grid)分布式緩存框架。
?
?
2. Quick start
2.1 安裝
Coherence是純Java的框架,不需要額外的安裝。首先在Oracle網(wǎng)站上下載開(kāi)發(fā)包,最新為3.4版,只有13M,可以說(shuō)是很小很強(qiáng)大。
SDK解壓即可,包含 bin, doc, example, lib 四個(gè)目錄。Doc下包含了完整的user-guide,只是有點(diǎn)長(zhǎng),有350多頁(yè)。
2.2 運(yùn)行
Coherence集群是由Node構(gòu)成的,每個(gè)Node既存儲(chǔ)數(shù)據(jù),又可以查詢數(shù)據(jù)。
運(yùn)行 bin/coherence.cmd 命令就能啟動(dòng)一個(gè)Node實(shí)例。
運(yùn)行多次,就能啟動(dòng)多個(gè)實(shí)例,各Node能自動(dòng)檢測(cè)到網(wǎng)路內(nèi)新啟動(dòng)的Node,并加入集群。
第一個(gè)節(jié)點(diǎn)啟動(dòng)信息大致為:
? (
? ThisMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828)
? OldestMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828)
? ActualMemberSet=MemberSet(Size=1, BitSetCount=2
??? Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828)
??? )
第二個(gè)節(jié)點(diǎn)啟動(dòng)信息大致為:
? (
? ThisMember=Member(Id=2, Timestamp=2007-05-23 10:48:53.218, Address=192.168.0.204:8089, MachineId=26828)
? OldestMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828)
? ActualMemberSet=MemberSet(Size=2, BitSetCount=2
??? Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828)
??? Member(Id=2, Timestamp=2007-05-23 10:48:53.218, Address=192.168.0.204:8089, MachineId=26828)
??? )
? 最后會(huì)出現(xiàn)命令行提示符,通過(guò)Coherence控制臺(tái)命令就可以執(zhí)行Cache的基本操作。
???????????????????????????????????????????????????
最常用命令有:
創(chuàng)建或切換到一個(gè)cache:
???????????
Put一個(gè)數(shù)據(jù):
???
Get一個(gè)數(shù)據(jù):?
???????
查看有哪些cache:
查看一個(gè)cache下的所有key:
?????
你不必關(guān)心數(shù)據(jù)存在哪里,可以在Node1上 put一個(gè)數(shù)據(jù),在Node2上get出來(lái)。
默認(rèn)啟動(dòng)Node使用的是 Coherence.jar中的緩存配置文件 coherence-cache-config.xml ,使用的是DistributedCache 分區(qū)緩存。
3. 編程
正如第一節(jié)所說(shuō),使用Coherence進(jìn)行數(shù)據(jù)管理的應(yīng)用程序中的API調(diào)用非常簡(jiǎn)單,無(wú)論集群有多少個(gè)物理機(jī)器,多少個(gè)節(jié)點(diǎn)實(shí)例,客戶端只邏輯上面對(duì)集群。
NamedCache cache = CacheFactory.getCache( cacheName );
cache.put(key, value);
Object value = cache.get(key);
記得在你的應(yīng)用中(例如:BOSS,CRM等)中包含 coherence.jar, tangosol.jar 等必要的類庫(kù)文件。
四種緩存類型
4. 基本緩存類型及適用情況
Coherence 支持四種Cache類型(Cache Type),也可看作四種緩存系統(tǒng)架構(gòu):
4.1 復(fù)制緩存(Replicated Cache)
數(shù)據(jù)在集群成員中進(jìn)行全復(fù)制,每個(gè)節(jié)點(diǎn)都有一個(gè)完整的數(shù)據(jù)拷貝。這種集群下,read性能最高( cache.get(key) 操作),容錯(cuò)性好,但cache.put(key,value) 操作性能較低。如果Node很多,每次put操作都要在所有成員上執(zhí)行一次。
? cache.get(key)
? cache.put(key,value)
這是一種傳統(tǒng)的集群技術(shù),不是Coherence的亮點(diǎn)。
4.1 樂(lè)觀緩存 (Optimistic Cache)
它類似于復(fù)制緩存,但不提供并發(fā)控制(Concurrency Control)。這種集群數(shù)據(jù)吞吐量最高,各節(jié)點(diǎn)容易出現(xiàn)數(shù)據(jù)不一致的情況。
4.1 分區(qū)緩存 (Distributed (Partitioned) Cache)
Coherence 的亮點(diǎn)。默認(rèn)情況下,一份數(shù)據(jù)A只在兩個(gè)節(jié)點(diǎn)上有拷貝,第二份作為備份數(shù)據(jù)(Backup),用于容錯(cuò)。
從整體上看,假設(shè)應(yīng)用需要的Cache總內(nèi)存為 M,該模式將數(shù)據(jù)分散到N個(gè)節(jié)點(diǎn)上,每個(gè)JVM只占用 M/N? 的內(nèi)存消耗,與復(fù)制緩存每節(jié)點(diǎn)消耗 M量的內(nèi)存形成對(duì)比,它可以極大節(jié)省內(nèi)存資源。
??? cache.get(key)
??? cache.put(key,value)
4.1 Near緩存 (NearCache)
分區(qū)緩存的改進(jìn)版。分區(qū)緩存將數(shù)據(jù)全部存到Cache Node上,而Near緩存將緩存數(shù)據(jù)中使用頻率最高的數(shù)據(jù)(熱點(diǎn)數(shù)據(jù)Hotspot)放到應(yīng)用的本地緩存(Local Cache)區(qū)域。由于本地內(nèi)存訪問(wèn)的高效性,它可以有效提升分區(qū)緩存的read性能。
四種緩存類型的基本特點(diǎn)對(duì)比如下表所示:
幾個(gè)重要因素:
JVM數(shù)量(N): 即啟動(dòng)的Node數(shù)量,每個(gè)節(jié)點(diǎn)為一個(gè)JVM進(jìn)程;
數(shù)據(jù)大小(M):要緩存的數(shù)據(jù)總量的占用空間大小,如10M,120M等;
冗余度(R) :緩存的secondary備份個(gè)數(shù)。分區(qū)緩存默認(rèn)為1,可以配置2,3,…
本地緩存大小(L):(僅對(duì)Near緩存而言)應(yīng)用所在的本地緩存的空間大小字節(jié)數(shù)。
幾種類型的對(duì)比
?
Coherence企業(yè)級(jí)緩存(五)與Hibernate集成(1)
Oracle Coherence 是一個(gè)面向企業(yè)級(jí)應(yīng)用的分布式緩存框架,看過(guò)它的簡(jiǎn)單介紹后,感覺(jué)是:很好很強(qiáng)大。
?? Hibernate 封裝了統(tǒng)一的 Cache接口 CacheProvider ,可以方便的集成實(shí)現(xiàn)該接口的第三方Cache框架。
? 本文就不詳細(xì)介紹 Coherence 的特點(diǎn)和優(yōu)勢(shì)了,感興趣或要使用的直接到Oracle網(wǎng)站去查詢。
http://www.oracle.com/products/middleware/coherence/index.html
如何與Hibenate進(jìn)行集成, Coherence的userguide只簡(jiǎn)單說(shuō)了一下原理性的東東,沒(méi)有具體實(shí)例。我仔細(xì)做了一個(gè)從頭到尾的過(guò)程,直到Hibernate應(yīng)用跑起來(lái),并觀察日志,確認(rèn)Coherence緩存起作用為止。 以下是我記錄下來(lái)的配置運(yùn)行過(guò)程,供需要的同學(xué)參考。
1. 運(yùn)行前的說(shuō)明
????? 本 demo 客戶端是Hibernate的數(shù)據(jù)操作代碼,無(wú)外乎 session.update(),query.list() 等等。
????? 測(cè)試準(zhǔn)備兩臺(tái)物理機(jī)器 M1, M2 。M1 上跑Hibernate應(yīng)用, 和1個(gè)Node; M2上準(zhǔn)備跑 2 個(gè)Coherence 緩存節(jié)點(diǎn)(Node).? 這里3個(gè)Node分散到兩個(gè) 機(jī)器,主要是演示Coherence集群的自管理的強(qiáng)大功能。
?????
????? [img]/upload/attachment/42720/e4c427b3-1651-3092-a207-fe6da4f102bf.jpg" alt="[/img]
????? 原理簡(jiǎn)要說(shuō)明:M2上的Node啟動(dòng)后,將自動(dòng)加入Coherence 緩存集群(Cluster); 客戶端Hibernate應(yīng)用啟動(dòng),執(zhí)行后,由于也使用了Coherence, 它的查詢操作將到 集群 上的三個(gè)Node的Cache中去取數(shù)據(jù);只是第一次query會(huì)從數(shù)據(jù)庫(kù)取數(shù)據(jù),并放到Node的緩存中,以后各次query,findByPk 等操作,都會(huì)到Node的緩存中取。
2. Cache服務(wù)端配置
2.1) 啟動(dòng)Node bat文件準(zhǔn)備
????? Coherence開(kāi)發(fā)包的目錄很簡(jiǎn)單,只有 bin,doc,lib,examples 四個(gè)目錄,原以為只要啟動(dòng) coherence/bin/coherence.cmd 就可以了,后來(lái)發(fā)現(xiàn)沒(méi)那么簡(jiǎn)單。
????? 要讓M2上的Node緩存Hibernate應(yīng)用的數(shù)據(jù),需要 org.hibernate.cache.QueryKey 等類,因此需要將 hibernate3.jar 加入classpath;
????? 要緩存hibernate應(yīng)用中的 com.xxx.system.perm.PermVO 等VO類,還必須將自己應(yīng)用的 jar包也放到classpath中。
其他還需要一些相關(guān)的jar,如:dom4j,common-logging 等,最終編寫(xiě)了一個(gè) runCache.bat 文件,做好必要的初始化工作:
runCache.bat
rem Register cache region: org.hibernate.cache.StandardQueryCache
rem Register cache region: HIBERNATE_QUERY_CACHE
set java_opts=-Dtangosol.coherence.cacheconfig=hibernate-cache-config.xml
set classpath=lib/hibernate3.jar
set classpath=%classpath%;lib/hibernate3-sqlquerycache-fix.jar
set classpath=%classpath%;lib/dom4j-1.6.jar
set classpath=%classpath%;lib/commons-lang-2.1.jar
set classpath=%classpath%;lib/commons-logging.jar
set classpath=%classpath%;lib/cglib-2.1.jar
set classpath=%classpath%;lib/xxx-project.jar
coherence.cmd
我的coherence工作目錄是
其中在我的工作目錄下專門(mén)建了一個(gè) lib 目錄,存放需要的新的jar包,并將配置文件從 coherence-hibernate.jar/config 目錄下移到工作目錄下,目錄結(jié)構(gòu)是:
lib
hibernate-cache-config.xml
runCache.bat
[img]/upload/attachment/42577/11dfaeba-8a74-39e3-9c3d-d60cb47dd2b8.jpg" alt="[/img]
這要,運(yùn)行 runCache.bat 就可以啟動(dòng)一個(gè) Coherence Node實(shí)例。本文在M2機(jī)器上開(kāi)2個(gè) cmd 窗口,啟動(dòng)2個(gè)實(shí)例, 在 M1 上啟動(dòng)一個(gè) Node 實(shí)例。啟動(dòng)后的結(jié)果大致如:
[img]/upload/attachment/42575/57ba5d87-1175-38fb-ac4c-d7902d61bb9a.jpg" alt="" width="512" height="304[/img]
MasterMemberSet
? (
? ThisMember=Member(Id=3, Timestamp=2008-10-14 17:41:25.062, Address
? OldestMember=Member(Id=1, Timestamp=2008-10-14 17:39:30.125, Addre
? ActualMemberSet=MemberSet(Size=3, BitSetCount=2
??? Member(Id=1, Timestamp=2008-10-14 17:39:30.125, Address=172.20.3
??? Member(Id=2, Timestamp=2008-10-14 17:41:03.234, Address=172.20.3
??? Member(Id=3, Timestamp=2008-10-14 17:41:25.062, Address=172.20.3
??? )
? RecycleMillis=120000
? RecycleSet=MemberSet(Size=0, BitSetCount=0
??? )
? 2.2) 緩存配置
hibernate-cache-config.xml 是一個(gè)必要的緩存配置,本例使用 HibernateReplicatedCache 復(fù)制模式。
通過(guò)
加入Java命令的啟動(dòng)參數(shù)中, coherence 會(huì)替換默認(rèn)的配置。
還要修改 coherence 的缺省啟動(dòng)命令 coherence.cmd, 將java_opts 加入到原有的變量中,將
修改為
并將 coherence-hibernate.jar 加入classpath中, 將
修改為
3. Cache客戶端配置:Hibernate配置
3.1) hibernate.cfg.xml
- < property ? name = "hibernate.cache.provider_class" > ??
- com.tangosol.coherence.hibernate.CoherenceCacheProvider </ property > ???? ??
- < property ? name = "hibernate.cache.use_minimal_puts" > true </ property > ??
- < property ? name = "hibernate.cache.use_query_cache" > true </ property > ??
<property name="hibernate.cache.provider_class">
com.tangosol.coherence.hibernate.CoherenceCacheProvider</property>
<property name="hibernate.cache.use_minimal_puts">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
3.2) 啟用查詢緩存的代碼
要確保代碼中使用查詢,即在創(chuàng)建 query 后,打開(kāi)開(kāi)關(guān),并設(shè)置cacheRegion,本例中使用統(tǒng)一的 cacheRegion “HIBERNATE_QUERY_CACHE”
- query.setCacheable( true ); ??
- query.setCacheRegion(HIBERNATE_QUERY_CACHE);??
query.setCacheable(true);
query.setCacheRegion(HIBERNATE_QUERY_CACHE);
3.3) 啟用實(shí)體L2緩存
在 hbm.xml 中配置? 節(jié)點(diǎn),為VO類啟用實(shí)體緩存。
- ? ??
- < class ? name = "com.xxx.system.perm.persistent.PermVO" ? table = "SYS_PERM" > ? ??
- < cache ? usage = "nonstrict-read-write" /> ??
<class name="com.xxx.system.perm.persistent.PermVO" table="SYS_PERM">
<cache usage="nonstrict-read-write"/>
???? 3.4) 客戶端緩存配置
客戶端要使用與服務(wù)端同樣的緩存配置 hibernate-cache-config.xml, 否則可能無(wú)法進(jìn)行存儲(chǔ)。 本例將其復(fù)制過(guò)來(lái),放到classpath 下的 config目錄中,因此,客戶端啟動(dòng)命令(如果是tomcat,weblogic,websphere,修改相應(yīng)cmd或bat文件)中也要加java參數(shù):
4. 啟動(dòng)客戶端Hibernate應(yīng)用程序
執(zhí)行數(shù)據(jù)查詢操作,觀察日志,以確定數(shù)據(jù)存儲(chǔ)到了M2的三個(gè)節(jié)點(diǎn)中。
4.1) Coherence客戶端啟動(dòng)日志
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389? (thread=main, member=n/a): Loaded ...
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389? (thread=main, member=n/a): Optional ...
Oracle Coherence Version 3.3.1/389
Grid Edition: Development mode
Copyright (c) 2000-2007 Oracle. All rights reserved.
2008-10-14 17:56:15.296 Oracle Coherence GE 3.3.1/389? (thread=Cluster, member=n/a): Service Cluster ...
2008-10-14 17:56:15.515 Oracle Coherence GE 3.3.1/389? (thread=Cluster, member=n/a): This Member(Id=5,...
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389? (thread=Cluster, member=n/a): Member(Id=2, Ti...
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389? (thread=Cluster, member=n/a): Member(Id=3, ....
2008-10-14 17:56:15.703 Oracle Coherence GE 3.3.1/389? (thread=main, member=5):
4.2) 觀察Hibernate SQL輸出
記得在log4j.xml 中打開(kāi)相應(yīng)的日志開(kāi)關(guān):
- < category ? name = "org.hibernate.SQL" > ??
- ???????? < priority ? value = "DEBUG" ? /> ???????? ??
- ???????? < appender-ref ? ref = "CONSOLE" ? /> ? <!--?ASYNC_Hibernate_SQL?--> ??
- ???? </ category > ?????????????????????
<category name="org.hibernate.SQL">
<priority value="DEBUG" />
<appender-ref ref="CONSOLE" /> <!-- ASYNC_Hibernate_SQL -->
</category>
觀察日志輸出
Execute No. 1 ********************
2008-10-14 18:00:44,687 [DEBUG](AbstractBatcher.java,346) - select? this.PERMCODE as? PERM1_15_0_, ....
(No.1)result size:1
Execute No. 2 ********************
(No.2)result size:1
Execute No. 3 ********************
(No.3)result size:1
Execute No. 4 ********************
(No.4)result size:1
Execute No. 5 ********************
(No.5)result size:1
第一次執(zhí)行了sql,
后面sql都未執(zhí)行,并且查詢結(jié)果數(shù)為1,和第一次執(zhí)行sql的結(jié)果相同。表明之后從Coherence中獲取了數(shù)據(jù), 緩存生效。
4.3) 查看M2 上的cache數(shù)據(jù):
在M2上的節(jié)點(diǎn)控制臺(tái)切換到 HIBERNATE_QUERY_CACHE cache下面,執(zhí)行:
cache HIBERNATE_QUERY_CACHE
并執(zhí)行Coherence命令
命令查看所有已在Cache中存儲(chǔ)的數(shù)據(jù)。 下面的日志每個(gè) sql:開(kāi)頭的就是一個(gè)對(duì)Query的緩存項(xiàng)。
Map (HIBERNATE_QUERY_CACHE): list
sql: select managelogv0_.LOGID as LOGID5_, managelogv0_.OPRTIME as
TE5_, managelogv0_.OPRACTION as OPRACTION5_, managelogv0_.OPRTYPE a
OG managelogv0_; parameters: ; named parameters: {}; first row: 0;
, 285, 286, 287, 288, 321]
key1 = value1
sql: select? this.PERMCODE as? PERM1_15_0_,? this.MODULECODE as? MO
RM5_15_0_,? this.PORTNO as? PORT6_15_0_ from (select? t.perm_code a
?????? t.module_code as moduleCode,
?????? t.perm_name as permName,
?????? t.perm_desc as permDesc,
?????? t.port_no as portNo,
?????? t.perm_type_code as permTypeCode
??????????????? from sys_perm t join sys_role_perm o
??? on t.perm_code = o.perm_code
??? where o.role_code = ? ) this? ; parameters: ; named parameters:
sql: select count(*) as col_0_0_ from SYS_MANAGELOG managelogv0_; p….
OK, 大功告成,成功將Coherence與Hibernate集成,Hibernate通過(guò)Coherence進(jìn)行實(shí)體數(shù)據(jù),查詢數(shù)據(jù)的緩存。
Coherence企業(yè)級(jí)緩存(六) JMX 管理和監(jiān)控
7.1 概述
Coherence支持集群JMX管理和監(jiān)控,方便在多Node環(huán)境下的統(tǒng)一管理。
根據(jù)Coherence官方的推薦,一般一個(gè)集群中只設(shè)置一個(gè)JMX管理服務(wù)器(MBeanServer),并且管理服務(wù)器不存儲(chǔ)數(shù)據(jù)(設(shè)置啟動(dòng)參數(shù)storage_enabled=false);其他Node為受管節(jié)點(diǎn),存儲(chǔ)數(shù)據(jù)。
7.2 啟動(dòng)參數(shù)
要為節(jié)點(diǎn)啟用JMX管理,啟動(dòng)時(shí)只要加入必要的java property即可。一般可以JDK5+自帶的JConsole工具做管理和監(jiān)控。
JMX Server:
JMX Node:
7.3 JMX Server監(jiān)控
通過(guò)JConsole連接Coherence JMX Server后的界面如下圖所示:
圖中,
Cluster代表整個(gè)集群
Node節(jié)點(diǎn)下代表各節(jié)點(diǎn),圖中有1,2 兩個(gè)節(jié)點(diǎn);
Cache目錄代表當(dāng)前集群中創(chuàng)建的的NamedCache,圖中展示了集群中有一個(gè)分區(qū)緩存 cache1,存儲(chǔ)在節(jié)點(diǎn)2 中。
其他還有Server,StorageManager,PointToPoint等管理項(xiàng)。
右側(cè)列出了所選項(xiàng)目的詳細(xì)屬性,圖中為Node 2 上數(shù)據(jù)存儲(chǔ)的信息,比較有用的是
命中次數(shù)CacheHits,
失誤次數(shù)CacheMisses,
緩存訪問(wèn)次數(shù):TotalGets,通過(guò) CacheHits/ TotalGets 就可得到命中率
緩存元素上限:HighUnits等。
通過(guò)觀察各節(jié)點(diǎn)Cache的主要指標(biāo),就可以監(jiān)控Coherence的運(yùn)行情況,分析緩存的利用效率。見(jiàn)下圖例:
圖顯示了在JOP號(hào)碼資源應(yīng)用下,號(hào)碼資源VO的CacheHits變化情況,命中數(shù)在逐步提高,為2800,說(shuō)明緩存有效發(fā)揮了其作用;當(dāng)然命中率是反映Cache利用率更為直觀的指標(biāo)。
7.4 Node監(jiān)控
通過(guò)連接不同Node,還可以監(jiān)控各存儲(chǔ)節(jié)點(diǎn)的內(nèi)存變化等信息,為調(diào)優(yōu)提供必要依據(jù)。
?
Coherence企業(yè)級(jí)緩存(七) 性能調(diào)優(yōu)
Coherence調(diào)優(yōu)是很關(guān)鍵的一環(huán),特別是對(duì)大型企業(yè)級(jí)應(yīng)用,海量數(shù)據(jù)型應(yīng)用,它將決定Coherence集群能否將效能最大化的發(fā)揮出來(lái)。
調(diào)優(yōu)通常分三步:
基礎(chǔ)調(diào)優(yōu),運(yùn)行前常規(guī)調(diào)優(yōu),運(yùn)行后調(diào)優(yōu)
8.1基礎(chǔ)調(diào)優(yōu)
包括操作系統(tǒng)調(diào)優(yōu),網(wǎng)絡(luò)調(diào)優(yōu)
操作系統(tǒng)的一些參數(shù),對(duì)Coherence集群的數(shù)據(jù)傳輸有影響。
如:非Wins系統(tǒng)下Socket緩沖大小,應(yīng)該至少增加到2M;Windows上的Datagram大小等,這些在官方指南中有詳細(xì)的說(shuō)明。
網(wǎng)絡(luò)調(diào)優(yōu)主要對(duì)交換機(jī)緩沖(Switch Buffer), Path MTU 等因素,比較常見(jiàn)的情況是,交換機(jī)緩存如果太小,Coherence在做Node通信時(shí)會(huì)發(fā)生延遲,Node日志一般為:
此時(shí)就需要增加交換機(jī)緩沖大小。
8.2運(yùn)行前常規(guī)調(diào)優(yōu)
指根據(jù)Coherence一般經(jīng)驗(yàn)原則和最佳實(shí)踐,在應(yīng)用系統(tǒng)運(yùn)行前分析緩存數(shù)據(jù)總量大小,計(jì)算Node個(gè)數(shù),設(shè)置Node JVM內(nèi)存等。
緩存數(shù)據(jù)總量大小(DataSize, M):根據(jù)應(yīng)用規(guī)模,數(shù)據(jù)量規(guī)模,業(yè)務(wù)頻度,預(yù)先估計(jì)應(yīng)該納入緩存的數(shù)據(jù)量的大小(總字節(jié)數(shù))。對(duì)大型系統(tǒng)來(lái)說(shuō),可能是1G – xG。
計(jì)算節(jié)點(diǎn)個(gè)數(shù):分區(qū)和Near緩存每節(jié)點(diǎn)只承擔(dān) M/N 的數(shù)據(jù)量,Coherence的原則是,盡量多節(jié)點(diǎn),而不要將Node的內(nèi)存設(shè)置過(guò)大,避免GC時(shí)間過(guò)長(zhǎng),一般不要超過(guò) 1G;因此,得到估計(jì)的數(shù)據(jù)總量大小M后,就可以估計(jì)需要配置的節(jié)點(diǎn)數(shù),假設(shè)JVM mx為512M,則N=M/512,并據(jù)此推測(cè)需要的物理機(jī)器的數(shù)量。
JVM內(nèi)存:Coherence默認(rèn)為64M,每節(jié)點(diǎn)最大不要超過(guò)1G。并且最小和最大值設(shè)置為相同。當(dāng)然可以根據(jù)項(xiàng)目情況,設(shè)置為 384m, 128m等。
例如:
?
GC 參數(shù):一般應(yīng)用Coherence的多為大型系統(tǒng),多CPU;且緩存數(shù)據(jù)變化可能比較頻繁。
GC收集器個(gè)數(shù)設(shè)置為 CPU個(gè)數(shù);
適當(dāng)加大新生代的內(nèi)存大小。
8.3運(yùn)行后調(diào)優(yōu)
系統(tǒng)上線后,在運(yùn)行過(guò)程中,可能會(huì)出現(xiàn)性能不如預(yù)期的情況,或者不定期出現(xiàn)緩慢情況。除了對(duì)JVM 垃圾回收問(wèn)題進(jìn)行分析,還可以對(duì)應(yīng)用進(jìn)行分析,對(duì)緩存配置進(jìn)行優(yōu)化。
JVM 垃圾回收問(wèn)題:節(jié)點(diǎn)GC時(shí),會(huì)導(dǎo)致Node間的傳輸暫停,需要重傳,引起集群性能下降。可可以通過(guò)Node的日志觀察到,類似于:
除了之前的優(yōu)化交換機(jī)緩沖,還要考慮垃圾回收引起此問(wèn)題的具體原因,可以通過(guò)打開(kāi)垃圾回收日志進(jìn)行觀察,這通常可能會(huì)定位到程序代碼的算法等問(wèn)題。
應(yīng)用分析:
如果為了簡(jiǎn)便,在Coherence配置中使用 * 配置NamedCache的存儲(chǔ)屬性,那么意味著,所有NamedCache或者說(shuō)一部分Cache 使用了相同的設(shè)置,如元素個(gè)數(shù),超時(shí)時(shí)間,清除策略,前端緩存大小等。
<cache-mapping>
<!—Hiberante Entity cache configuration -->
<cache-name>*</cache-name> <!— 類似配置如:near-*, com.xxx.crm.customer.* ?-->
<scheme-name>hibernate-near</scheme-name>
<init-params>
<init-param> <!-- 后端entry個(gè)數(shù)限制 -->
<param-name>back-size-limit</param-name> <param-value>1000</param-value>
</init-param>
<init-param> <!-- 后端超時(shí)時(shí)間 30m -->
<param-name>back-expiry</param-name> <param-value>30m</param-value>
</init-param>
</init-params>
</cache-mapping>
但不同業(yè)務(wù)功能其數(shù)據(jù)量大小,查詢頻率,查詢條件的多樣性,數(shù)據(jù)修改的頻率都是不同的,如果配置相同,則Cache機(jī)制在不同業(yè)務(wù)上體現(xiàn)的性能是不同的,應(yīng)該區(qū)別對(duì)待,例如:
1) 數(shù)據(jù)字典修改頻率極低,可以只采用local cache, 超時(shí)時(shí)間設(shè)置長(zhǎng)一些,例如12h 。
2) 鑒權(quán)操作頻率很高,因此要求高性能。鑒權(quán)數(shù)據(jù)中權(quán)限點(diǎn)修改頻率低,但角色授權(quán)數(shù)據(jù)修改頻率略高,但比一般業(yè)務(wù)也低很多,可以將 front cache設(shè)置大一些,或者只采用local訪問(wèn)。
3) 在Hibernate中,低頻修改數(shù)據(jù)緩存配置為 nonstrict-read-write 類型;只讀數(shù)據(jù)采用 read-only 型。
4) 至于業(yè)務(wù)數(shù)據(jù),情況比較復(fù)雜。
例如:手機(jī)號(hào)碼表,數(shù)據(jù)量極大,并且服務(wù)于BOSS大部分業(yè)務(wù),并且手機(jī)號(hào)碼的用戶資料變更較少,因此緩存可以設(shè)置大些, 超時(shí)時(shí)間設(shè)置長(zhǎng)些。而類似的渠道數(shù)據(jù),數(shù)據(jù)量略小一些,HighUnits可設(shè)置稍小一些。
而對(duì)于一些修改頻繁,或新增頻繁的數(shù)據(jù),超時(shí)時(shí)間(Expiry Delay) 應(yīng)當(dāng)設(shè)置小一些。
此類分析應(yīng)該跟蹤生產(chǎn)環(huán)境的運(yùn)行情況,業(yè)務(wù)頻率,修改操作頻率等,進(jìn)行調(diào)整優(yōu)化,并跟蹤調(diào)優(yōu)后的結(jié)果。
9. 結(jié)束
Oracle Coherence具有一般緩存框架的極不一樣的強(qiáng)大特性,自管理,分區(qū)緩存,線性擴(kuò)展等使得它能有效提升應(yīng)用,特別是大型企業(yè)級(jí)應(yīng)用的性能。Coherence也是一個(gè)網(wǎng)格計(jì)算方案,其線性擴(kuò)展也體現(xiàn)了“另類”的系統(tǒng)架構(gòu),能發(fā)揮出強(qiáng)大的功能。
Coherence企業(yè)級(jí)緩存(一) 特點(diǎn)
Coherence企業(yè)級(jí)緩存(二) QuickStart和編程
Coherence企業(yè)級(jí)緩存(三) 四種緩存類型
Coherence企業(yè)級(jí)緩存(四) 數(shù)據(jù)管理模式
Coherence企業(yè)級(jí)緩存(五)與Hibernate集成(1)
Coherence企業(yè)級(jí)緩存(五)與Hibernate集成(2)
Coherence企業(yè)級(jí)緩存(六) JMX 管理和監(jiān)控
Coherence企業(yè)級(jí)緩存(七) 性能調(diào)優(yōu)
?
?
參考資料:
1. Oracle. Coherence User-guide.htm
2. http://www.oracle.com/technology/global/cn/products/coherence/index.html
3. iniu blog?? http://iniu.net/iwork/2008/02/oracle-coherence.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
