1、服務(wù)器集群
服務(wù)器集群就是指將很多服務(wù)器集中起來(lái)一起進(jìn)行同一種服務(wù),在客戶端看來(lái)就像是只有一個(gè)服務(wù)器集群可以利用多個(gè)計(jì)算機(jī)進(jìn)行并行計(jì)算從而獲得很高的計(jì)算速度,也可以用多個(gè)計(jì)算機(jī)做備份,從而使得任何一個(gè)機(jī)器壞了整個(gè)系統(tǒng)還是能正常運(yùn)行。
使用集群服務(wù)器構(gòu)建的集群系統(tǒng)優(yōu)點(diǎn)在于:
(1)統(tǒng)集群系統(tǒng)可解決所有的服務(wù)器硬件故障,當(dāng)某一臺(tái)服務(wù)器出現(xiàn)任何故障,如:硬盤、內(nèi)存、CPU、主板、I/O板以及電源故障,運(yùn)行在這臺(tái)服務(wù)器上的應(yīng)用就會(huì)切換到其它的服務(wù)器上。
(2)集群系統(tǒng)可解決軟件系統(tǒng)問(wèn)題,我們知道,在計(jì)算機(jī)系統(tǒng)中,用戶所使用的是應(yīng)用程序和數(shù)據(jù),而應(yīng)用系統(tǒng)運(yùn)行在操作系統(tǒng)之上,操作系統(tǒng)又運(yùn)行在服務(wù)器上。這樣,只要應(yīng)用系統(tǒng)、操作系統(tǒng)、服務(wù)器三者中的任何一個(gè)出現(xiàn)故障,系統(tǒng)實(shí)際上就停止了向客戶端提供服務(wù),比如我們常見(jiàn)的軟件死機(jī),就是這種情況之一,盡管服務(wù)器硬件完好,但服務(wù)器仍舊不能向客戶端提供服務(wù)。而集群的最大優(yōu)勢(shì)在于對(duì)故障服務(wù)器的監(jiān)控是基于應(yīng)用的,也就是說(shuō),只要服務(wù)器的應(yīng)用停止運(yùn)行,其它的相關(guān)服務(wù)器就會(huì)接管這個(gè)應(yīng)用,而不必理會(huì)應(yīng)用停止運(yùn)行的原因是什么。
(3)集群系統(tǒng)可以解決人為失誤造成的應(yīng)用系統(tǒng)停止工作的情況,例如:當(dāng)管理員對(duì)某臺(tái)服務(wù)器操作不當(dāng)導(dǎo)致該服務(wù)器停機(jī),因此運(yùn)行在這臺(tái)服務(wù)器上的應(yīng)用系統(tǒng)也就停止了運(yùn)行。由于集群是對(duì)應(yīng)用進(jìn)行監(jiān)控,因此其它的相關(guān)服務(wù)器就會(huì)接管這個(gè)應(yīng)用,提高了應(yīng)用系統(tǒng)的穩(wěn)定性。
2、常見(jiàn)問(wèn)題
應(yīng)用系統(tǒng)升級(jí)到集群服務(wù)器環(huán)境下,碰到的主要問(wèn)題是Hibernate代理的主鍵在插入時(shí),主鍵重復(fù)異常信息明顯增多。通過(guò)對(duì)應(yīng)用系統(tǒng)源代碼進(jìn)行分析,發(fā)現(xiàn)出現(xiàn)的問(wèn)題主要為以下兩方面。
2.1 Hibernate的Generator配置為increment
increment方式為Hibernate提供的一種內(nèi)置的常用的主鍵生成器策略,此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。這種方式可能產(chǎn)生的問(wèn)題是:如果當(dāng)前有多個(gè)實(shí)例訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù),那么由于各個(gè)實(shí)例各自維護(hù)主鍵狀態(tài),不同實(shí)例可能生成同樣的主鍵,從而造成主鍵重復(fù)異常。因此,如果同一數(shù)據(jù)庫(kù)有多個(gè)實(shí)例訪問(wèn),此方式必須避免使用。
目前我們的應(yīng)用系統(tǒng)環(huán)境為最簡(jiǎn)單的集群方式:兩臺(tái)was,一臺(tái)數(shù)據(jù)庫(kù)的方式。所以當(dāng)有并發(fā)情況訪問(wèn)系統(tǒng)且兩個(gè)請(qǐng)求又被分發(fā)給兩臺(tái)was時(shí),假設(shè)當(dāng)前數(shù)據(jù)庫(kù)id最大為40,兩臺(tái)was分別會(huì)產(chǎn)生兩條id為41的數(shù)據(jù)導(dǎo)致插入失敗(Duplicate entry主鍵重復(fù))。
Increment主鍵生成器的org.hibernate.id.IncrementGenerator類里面,是使用select max(columnName)from tableName的方式來(lái)獲取。原來(lái)的程序一直運(yùn)行很好,但是在用兩個(gè)was來(lái)負(fù)載均衡后卻出現(xiàn)問(wèn)題。為什么?IncrementGenerator類里面的generate()方法雖然被聲明成了synchronized,但現(xiàn)在兩個(gè)Tomcat分別運(yùn)行在兩臺(tái)服務(wù)器的兩個(gè)獨(dú)立的Java虛擬機(jī)里,顯然問(wèn)題在這里,synchronized只能在一個(gè)獨(dú)立的Java虛擬機(jī)內(nèi)部有效。所以,在兩個(gè)Tomcat中用select max同時(shí)取主鍵,就相當(dāng)于在沒(méi)有synchronized的保護(hù)下,并發(fā)時(shí)就會(huì)取出相同的值,再insert就會(huì)發(fā)生dumplicate entry的錯(cuò)誤。
2.2 Hibernate的cache配置策略問(wèn)題
Hibernate的cache是他提高效率的主要原因,比如我lOAd,save的各種數(shù)據(jù)都會(huì)在緩存起來(lái),用id標(biāo)識(shí),當(dāng)我下次再次查詢的時(shí)候,它會(huì)把id的集合都查出來(lái),然后在緩存中遍歷,如果都遍歷到了,將不再訪問(wèn)數(shù)據(jù)庫(kù)。顯然這在集群環(huán)境下,也是小概率事件,但是這不影響數(shù)據(jù)正確完整,真正影響數(shù)據(jù)的是read-write cache。
Hibernate的緩存分為一級(jí)緩存和二級(jí)緩存,二級(jí)緩存需要特殊配置,通常情況下不用,一級(jí)緩存就包括上一個(gè)段落說(shuō)的情況,分為read-only cache和read-write cache。Read-only cache只讀的緩存會(huì)導(dǎo)致性能上的波動(dòng),卻不影響數(shù)據(jù),在上一段落已經(jīng)舉例說(shuō)明。Read-write cache讀寫緩存則會(huì)影響數(shù)據(jù)邏輯,比如我在緩存里放入一個(gè)值名對(duì)叫flag=1來(lái)標(biāo)識(shí)我已經(jīng)具有操作權(quán)限,放入was1了但是下次請(qǐng)求可能發(fā)到was2上去了,結(jié)果我找不到這個(gè)值,導(dǎo)致我認(rèn)為自己沒(méi)權(quán)限,或者我想修改他卻找不到它的值了。
3、解決方案
3.1針對(duì)自增字段問(wèn)題
Hibernate的主鍵生成雖然支持很多種數(shù)據(jù)庫(kù)獨(dú)有的increment方式,還有他自己的select max實(shí)現(xiàn)的increment方式,其實(shí)這些都不是很好,假如將來(lái)真的要切換數(shù)據(jù)庫(kù),并且是在集群下運(yùn)行程序,某種數(shù)據(jù)庫(kù)獨(dú)有的increment和select max方式的increment都會(huì)帶來(lái)問(wèn)題。
Hibernate中唯一一種最簡(jiǎn)單通用的主鍵生成器就是uuid-hex。雖然是個(gè)32位難讀的長(zhǎng)字符串,但是它沒(méi)有跨數(shù)據(jù)庫(kù)的問(wèn)題,將來(lái)切換數(shù)據(jù)庫(kù)極其簡(jiǎn)單方便,推薦使用。有不少項(xiàng)目使用identity,就是引用數(shù)據(jù)庫(kù)自有的序列機(jī)制,雖然保證了唯一,但是數(shù)據(jù)庫(kù)遷移的時(shí)候需要做初始值重置的工作,也不很看好。
3.2針對(duì)緩存問(wèn)題
在配置時(shí),
4、結(jié)語(yǔ)
Hibernate框架為0R轉(zhuǎn)換帶來(lái)了方便,在單獨(dú)服務(wù)器環(huán)境下只有單實(shí)例訪問(wèn)數(shù)據(jù)庫(kù),因此不存在并發(fā)不一致問(wèn)題;在集群環(huán)境下,多實(shí)例訪問(wèn)數(shù)據(jù)庫(kù),因此應(yīng)注意并發(fā)一致性問(wèn)題。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://m.guhuozai8.cn/
本文標(biāo)題:服務(wù)器集群環(huán)境下Hibernate使用問(wèn)題和解決方案
本文網(wǎng)址:http://m.guhuozai8.cn/html/consultation/1083934687.html