java學(xué)習(xí)心得筆記
可能的問題
通常,ejb組件在容器之間的移植不可避免地與如下問題相關(guān):
1.它需要依靠的受限制的特點(diǎn)在特定ejb容器中沒有得到加強(qiáng)。
2.它需要依靠的非標(biāo)準(zhǔn)的服務(wù)從容器中可獲得。
為了保證ejb組件的可移植性和一致的行為,你應(yīng)該使用一個(gè)具有與java2平臺(tái)安全
策略集相一致的策略集的容器來(lái)測(cè)試ejb組件,并且其加強(qiáng)了前述的編程限制。
總結(jié)
ejb組件開發(fā)者應(yīng)該知道這些推薦的關(guān)于ejb組件的編程限制,明白它們的重要性,并且從組件的穩(wěn)定性和可移植性利益方面考慮來(lái)遵循它們。因?yàn)檫@些編程限制能阻止你使用標(biāo)準(zhǔn)的java語(yǔ)言的特點(diǎn),違背了這些編程限制在編譯時(shí)不會(huì)知道,并且加強(qiáng)這些限制也不是ejb容器的責(zé)任。所有這些原因都使你應(yīng)很小心地遵守這些編程限制,這些限制在組件的合同中已經(jīng)成為了一個(gè)條款,并且它們對(duì)于建造可靠的、可移植的組件是非常重要的。
2. 優(yōu)化ejb
entity bean為在應(yīng)用程序和設(shè)計(jì)中描述持久化商業(yè)對(duì)象(persistent business objec ts)提供了一個(gè)清晰的模型。在java對(duì)象模型中,簡(jiǎn)單對(duì)象通常都是以一種簡(jiǎn)單的方式進(jìn)行處理但是,很多商業(yè)對(duì)象所需要的事務(wù)化的持久性管理沒有得到實(shí)現(xiàn)。entity bean將持久化機(jī)制封裝在容器提供的服務(wù)里,并且隱藏了所有的復(fù)雜性。entity bean允許應(yīng)用程序操縱他們就像處理一個(gè)一般的java對(duì)象應(yīng)用。除了從調(diào)用代碼中隱藏持久化的形式和機(jī)制外,entity bean還允許ejb容器對(duì)對(duì)象的持久化進(jìn)行優(yōu)化,保證數(shù)據(jù)存儲(chǔ)具有開放性,靈活性,以及可部署性。在一些基于ejb技術(shù)的項(xiàng)目中,廣泛的使用oo技術(shù)導(dǎo)致了對(duì)entity bean的大量使用,sun的工程師們已經(jīng)積累了很多使用entity bean的經(jīng)驗(yàn),這篇文章就詳細(xì)闡述的這些卡發(fā)經(jīng)驗(yàn):
*探索各種優(yōu)化方法
*提供性能優(yōu)化和提高適用性的法則和建議
*討論如何避免一些教訓(xùn)。
法則1:只要可以,盡量使用cmp
cmp方式不僅減少了編碼的工作量,而且在container中以及container產(chǎn)生的數(shù)據(jù)庫(kù)訪問代碼中包括了許多優(yōu)化的可能。container可以訪問內(nèi)存緩沖中的bean,這就允許它可以監(jiān)視緩沖中的任何變化。這樣的話就在事物沒有提交之前,如果緩存的數(shù)據(jù)沒有變化就不用寫到數(shù)據(jù)庫(kù)中。就可以避免許多不必要的數(shù)據(jù)庫(kù)寫操作。另外一個(gè)優(yōu)化是在調(diào)用find方法的時(shí)候。通常情況下find方法需要進(jìn)行以下數(shù)據(jù)庫(kù)操作:
查找數(shù)據(jù)庫(kù)中的紀(jì)錄并且獲得主鍵
將紀(jì)錄數(shù)據(jù)裝入緩存
cmp允許將這兩步操作優(yōu)化為一步就可以搞定。[具體怎么做我也沒弄明白,原文沒有具體闡述]
法則2:寫代碼時(shí)盡量保證對(duì)bmp和cmp都支持
許多情況下,ejb的開發(fā)者可能無(wú)法控制他們寫的bean怎么樣被部署,以及使用的container是不是支持cmp.
一個(gè)有效的解決方案是,將商業(yè)邏輯的編碼完全和持久化機(jī)制分離。再cmp類中實(shí)現(xiàn)商業(yè)邏輯,然后再編寫一個(gè)bmp類,用該類繼承cmp類。這樣的話,所有的商業(yè)邏輯都在cmp類中,而持久化機(jī)制在bmp中實(shí)現(xiàn)。[我覺得這種情況在實(shí)際工作中很少遇到,但是作者解決問題的思路值得學(xué)習(xí)]
法則3:把ejbstore中的數(shù)據(jù)庫(kù)訪問減小到最少。
如果使用bmp,設(shè)置一個(gè)緩存數(shù)據(jù)改變標(biāo)志dirty非常有用。所有改變數(shù)據(jù)庫(kù)中底層數(shù)據(jù)的操作,都要設(shè)置dirty,而在ejbstore()中,首先檢測(cè)dirty的值,如果dirty的值沒有改變,表明目前數(shù)據(jù)庫(kù)中的數(shù)據(jù)與緩存的一致,就不必進(jìn)行數(shù)據(jù)庫(kù)操作了,反之,就要把緩存數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。
法則4:總是將從lookup和find中獲得的引用進(jìn)行緩存。(cache)
引用緩存對(duì)session bean和entity bean 都是適用的。
通過jndi lookup獲得ejb資源。比如datasource,bean的引用等等都要付出相當(dāng)大的代價(jià)。因此應(yīng)該避免多余的lookup.可以這樣做:
將這些引用定義為實(shí)例變量。
從setentitycontext(session bean使用setsessioncontext)方法查找他們。setentitycontext方法對(duì)于一個(gè)bean實(shí)例只執(zhí)行一次,所有的相關(guān)引用都在這一次中進(jìn)行查找,這樣查找的代價(jià)就不是那么昂貴了。應(yīng)該避免在其他方法中查找引用。尤其是訪問數(shù)據(jù)庫(kù)的方法:ejbload()和ejbstore(),如果在這些頻繁調(diào)用的方法中進(jìn)行datasource的查找,勢(shì)必造成時(shí)間的浪費(fèi)。
調(diào)用其他entity bean的finder方法也是一種重量級(jí)的調(diào)用。多次調(diào)用finder()方法的代價(jià)非常高。如果這種引用不適合放在setentitycontext這樣的初始化時(shí)執(zhí)行的方法中執(zhí)行,就應(yīng)該在適當(dāng)?shù)臅r(shí)候緩存finder的執(zhí)行結(jié)果。只是要注意的是,如果這個(gè)引用只對(duì)當(dāng)前的entity有效,你就需要在bean從緩沖池中取出來(lái)代表另外一個(gè)實(shí)體時(shí)清除掉這些引用。,這些操作應(yīng)該在ejbactivate()中進(jìn)行。
法則5:總是使用prepare statements
這條優(yōu)化法則適用于所有訪問關(guān)系數(shù)據(jù)庫(kù)的操作。
數(shù)據(jù)庫(kù)在處理每一個(gè)sql statement的時(shí)候,執(zhí)行前都要對(duì)statement進(jìn)行編譯。一些數(shù)據(jù)庫(kù)具有緩存statement和statement的編譯后形式的功能。數(shù)據(jù)庫(kù)可以把新的statement和緩存中的進(jìn)行匹配。然而,如果要使用這一優(yōu)化特性,新的statement要必須和緩存中的statement完全匹配。
對(duì)于non-prepared statement,數(shù)據(jù)和statement本身作為一個(gè)字符串傳遞,這樣由于前后調(diào)用的數(shù)據(jù)不同而不能匹配,就導(dǎo)致無(wú)法使用這種優(yōu)化。而對(duì)于prepared statement,數(shù)據(jù)和statement是分開傳遞給數(shù)據(jù)庫(kù)的,這樣statement就可以和cache中已編譯的statement進(jìn)行匹配。statement就不必每次都進(jìn)行編譯操作。從而使用該優(yōu)化屬性。