【正文】
需要明確創(chuàng)建這個對象的特定實例,普通的實例是不能滿足的。類似的,你考慮一個超市類似的情況,你需要個售貨員但他叫什么并不重要,任何售貨員都可以滿足你。也就是,售貨員被放入池中共享,因為你只需要是售貨員就可以,而不是一個叫做史締夫的這個售貨員。當你離開超市的時候,你需要帶上你的孩子,不是其他人的孩子,而是你自己的。這個時候,孩子就需要被緩存。Figure 10. The application requests an object from the cache that is in the cache, so a reference to that object is returned without making a network trip to the database當你的緩存區(qū)太小的時候,緩存的性能就會明顯的受到影響。特別是,當一個請求去一個已經(jīng)滿了的緩存區(qū)域去請求一個對象的時候,下面的步驟就會執(zhí)行,這些步驟會在圖11中顯示: 1. 程序請求一個對象 2. 緩存檢測這個對象是否已經(jīng)存在于緩存中 3. 緩存決定把一個對象開除出緩存(一般采用的算法是遺棄最近使用次數(shù)最少的對象) 4. 把這個對象扔出緩存(稱為passivated) 5. 把從數(shù)據(jù)庫中裝載這個新對象并放入到緩存(稱為activated) 6. 把指向這個對象的引用返回給程序 Figure 11. Because the requested object is not in the cache, an object must be selected for removal from the cache and removed from it. 如果多數(shù)的請求都需要執(zhí)行這些步驟的話,那你采用緩存技術(shù)就不是好的選擇了!如果這些處理步驟頻繁發(fā)生的話,你就需要重新推敲下你的緩存了。回憶一下:從緩存中去除一個對象稱為passivation,從持久存儲區(qū)取出一個對象放入緩存稱為activation。能在緩存中找到的請求(緩存中有此請求的對象)的百分率稱為hit ratio,相反找不到的請求的百分率稱為miss ratio?! 【彺鎰偙怀跏蓟臅r候,hit ratio是0,它的activation數(shù)量非常高,因此在初始化后你需要去觀察緩存的性能。初始化以后,你應(yīng)該跟蹤passivation的數(shù)量并把它和與向緩存請求對象的請求的總量相比較,因為passivations只會發(fā)生在緩存被初始化以后。但一般來說,我們更需要關(guān)心緩存的miss ratio。如果miss ratio超過25%,那么緩存可能是太小了。因此,如果missratio的數(shù)量超過75%,那么不是你的緩存設(shè)置的太小就是你不需要緩存這個技術(shù)?! ∫坏┠阌X得你的緩存太小,就去嘗試著增大大小,并測試增加的性能。如果miss ration下降到20%以下,那你的緩存的大小就非常棒了,如果沒有什么效果,那么你就需要和這個程序的技術(shù)員聯(lián)系,看是這個對象是不是需要緩存或者是否應(yīng)該修正程序中這個對象的代碼?! taless session bean和messagedriven bean池 Stateless session bean 和messagedriven bean 在商業(yè)應(yīng)用方面很重要,不要期望它們會保持自己特有的狀態(tài)信息。當你的程序需要使用這些BEAN的商業(yè)功能的時候,它就從一個池中取出一個BEAN實例,用這個實例來調(diào)用一個個方法,用完后再將BEAN的實例再放回到池中。如果你的程序過了一會又需要這個一摸一樣的BEAN,就從池中再得到一個實例,但不能保證你得到的就是上一個實例。池能夠讓程序共享資源,但是會讓你的程序付出潛在的等待時間。如果你無法從池中得到想要的BEAN,請求就會等待,一直到這個BEAN被放入到池中。很多程序服務(wù)器都會把這些池調(diào)整的很好,但是我碰到過因為在環(huán)境中把他們設(shè)置的太小而引發(fā)的不少麻煩。Stateless bean池的大小應(yīng)該和可執(zhí)行線程池的大小一般大,因為一個線程同時只能使用一個對象,再多了就造成浪費的。因此,一些程序服務(wù)器把池的大小和線程的數(shù)量設(shè)置成同樣的數(shù)量。為了保險起見,你應(yīng)該親自把它設(shè)置成這個數(shù)。事務(wù) 使用Enterprise Java的一個好處就是它天生就支持事務(wù)。通過JAVAEE 5 EJB(Enterprise javaBeans)的注釋,你可以控制事務(wù)中方法的使用。事務(wù)會以下面2中方式結(jié)束: 1. 事務(wù)提交 2. 事務(wù)回滾 當一個事務(wù)被提交的時候,說明它已經(jīng)完全成功了,但是當它回滾的時候,就說明發(fā)生了一些錯誤。回滾會是下面2種情況: 1. 程序造成的回滾(程序回滾) 2. 非程序造成的回滾(非程序回滾) 通常,程序回滾是因為商業(yè)的規(guī)定。比如一個WEB程序做一個素描畫的價格的調(diào)查,程序可能讓用戶輸入年齡,并且商業(yè)規(guī)定18歲以上才可以進入。如果一個16歲的提交了信息,那么程序就會拋出一個錯誤,打開一個網(wǎng)頁告訴他,他年齡還不能參與到這個信息的調(diào)查。因為程序拋出了異常,因此包含在程序中的事務(wù)的就會發(fā)生回滾。這只是普通的程序回滾,只有當發(fā)生大量的程序回滾才值得我們注意?! ×硪环矫?,非程序回滾是非常糟糕的。有三種情形的非程序回滾: 1. 系統(tǒng)回滾 2. 超時回滾 3. 資源回滾 系統(tǒng)回滾意味著程序服務(wù)器中的一些東西非常的糟糕,恢復(fù)的幾率很渺茫。超時回滾就是當程序服務(wù)器中的程序處理請求時超時。除非你把超時設(shè)置的很短才會出現(xiàn)這種錯誤。資源回滾就是當一個程序服務(wù)器管理內(nèi)部的資源的時候發(fā)生錯誤。例如,如果你設(shè)置你的程序服務(wù)器通過一個簡單的SQL語句去測試數(shù)據(jù)庫的連接,但數(shù)據(jù)庫對于程序服務(wù)器來說是無法連接的,這個時候任何和這個資源相關(guān)的事情都會發(fā)生資源回滾?! ∪绻l(fā)生非程序回滾,我們應(yīng)該立刻注意,這個是不小的問題,但是你也需要留意程序回滾發(fā)生的頻率。很多時候人們對發(fā)生的異常很敏感,因此你需要哪些異常對你程序來說才是重要的?! 】偨Y(jié) 盡管各個程序和他們的環(huán)境都各不相同,但是有一些共同的問題困擾著他們。這篇文章的注意力并不是放在程序代碼的問題上,因為把注意力放在因為環(huán)境的問題而導(dǎo)致的低性能的問題上: 為了有效的診斷性能的問題,你應(yīng)該了解什么問題會導(dǎo)致什么樣的癥狀。如果主要是程序的代碼導(dǎo)致的惡果那你應(yīng)該帶著問題去尋求負責代碼的人尋求幫助,但是如果問題是由環(huán)境引起的,那么就要依靠你的操作來解決了?! 栴}的根源依賴于很多要素,但是一些指示器可以增加一些你處理問題時候的一些信心,依靠他們可以完全排除一些其他的原因。我希望這個文章能對你排解JAVAEE環(huán)境問題起到幫助。原文(英文)