掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

Java性能(néng)優化技巧集錦(二)

2019/3/2 18:18:55

Java性能(néng)優化技巧集錦(二)

二、J2EE篇

  前面介紹的(de)改善性能(néng)技巧适合于大(dà)多數Java應用(yòng),接下來要討(tǎo)論的(de)問題适合于使用(yòng)JSP、EJB或JDBC的(de)應用(yòng)。

  2.1 使用(yòng)緩沖标記

  一些應用(yòng)服務器(qì)加入了面向JSP的(de)緩沖标記功能(néng)。例如(rú),BEA的(de)WebLogic Server從6.0版本開(kāi)始支持這個(gè)功能(néng),Open Symphony工(gōng)程也(yě)同樣支持這個(gè)功能(néng)。JSP緩沖标記既能(néng)夠緩沖頁面片斷,也(yě)能(néng)夠緩沖整個(gè)頁面。當JSP頁面執行(xíng)時,如(rú)果目标片斷已經在緩沖之中,則生成該片斷的(de)代碼就不用(yòng)再執行(xíng)。頁面級緩沖捕獲對指定URL的(de)請求,并緩沖整個(gè)結果頁面。對于購(gòu)物(wù)籃、目錄以及門戶網站的(de)主頁來說,這個(gè)功能(néng)極其有(yǒu)用(yòng)。對于這類應用(yòng),頁面級緩沖能(néng)夠保存頁面執行(xíng)的(de)結果,供後繼請求使用(yòng)。

  對于代碼邏輯複雜的(de)頁面,利用(yòng)緩沖标記提高(gāo)性能(néng)的(de)效果比較明(míng)顯;反之,效果可(kě)能(néng)略遜一籌。
 

  2.2 始終通過會(huì)話(huà)Bean訪問實體Bean

  直接訪問實體Bean不利于性能(néng)。當客戶程序遠程訪問實體Bean時,每一個(gè)get方法都(dōu)是一個(gè)遠程調用(yòng)。訪問實體Bean的(de)會(huì)話(huà)Bean是本地(dì)的(de),能(néng)夠把所有(yǒu)數據組織成一個(gè)結構,然後返回它的(de)值。

  用(yòng)會(huì)話(huà)Bean封裝對實體Bean的(de)訪問能(néng)夠改進事務管理(lǐ),因爲會(huì)話(huà)Bean隻有(yǒu)在到(dào)達事務邊界時才會(huì)提交。每一個(gè)對get方法的(de)直接調用(yòng)産生一個(gè)事務,容器(qì)将在每一個(gè)實體Bean的(de)事務之後執行(xíng)一個(gè)“裝入-讀(dú)取”操作。

  一些時候,使用(yòng)實體Bean會(huì)導緻程序性能(néng)不佳。如(rú)果實體Bean的(de)唯一用(yòng)途就是提取和(hé)更新數據,改成在會(huì)話(huà)Bean之内利用(yòng)JDBC訪問數據庫可(kě)以得到(dào)更好的(de)性能(néng)。

  2.3 選擇合适的(de)引用(yòng)機制(zhì)

  在典型的(de)JSP應用(yòng)系統中,頁頭、頁腳部分(fēn)往往被抽取出來,然後根據需要引入頁頭、頁腳。當前,在JSP頁面中引入外部資源的(de)方法主要有(yǒu)兩種:include指令,以及include動作。

  include指令:例如(rú)<%@ include file="pagelist.html" %>。該指令在編譯時引入指定的(de)資源。在編譯之前,帶有(yǒu)include指令的(de)頁面和(hé)指定的(de)資源被合并成一個(gè)文(wén)件(jiàn)。被引用(yòng)的(de)外部資源在編譯時就确定,比運行(xíng)時才确定資源更高(gāo)效。
include動作:例如(rú)<jsp:include page="pagelist.html" />。該動作引入指定頁面執行(xíng)後生成的(de)結果。由于它在運行(xíng)時完成,因此對輸出結果的(de)控制(zhì)更加靈活。但(dàn)時,隻有(yǒu)當被引用(yòng)的(de)内容頻繁地(dì)改變時,或者在對主頁面的(de)請求沒有(yǒu)出現之前,被引用(yòng)的(de)頁面無法确定時,使用(yòng)include動作才合算。

2.4 在部署描述器(qì)中設置隻讀(dú)屬性
  實體Bean的(de)部署描述器(qì)允許把所有(yǒu)get方法設置成“隻讀(dú)”。當某個(gè)事務單元的(de)工(gōng)作隻包含執行(xíng)讀(dú)取操作的(de)方法時,設置隻讀(dú)屬性有(yǒu)利于提高(gāo)性能(néng),因爲容器(qì)不必再執行(xíng)存儲操作。

  2.5 緩沖對EJB Home的(de)訪問

  EJB Home接口通過JNDI名稱查找獲得。這個(gè)操作需要相(xiàng)當可(kě)觀的(de)開(kāi)銷。JNDI查找最好放(fàng)入Servlet的(de)init()方法裏面。如(rú)果應用(yòng)中多處頻繁地(dì)出現EJB訪問,最好創建一個(gè)EJBHomeCache類。EJBHomeCache類一般應該作爲singleton實現。

  2.6 爲EJB實現本地(dì)接口

  本地(dì)接口是EJB 2.0規範新增的(de)内容,它使得Bean能(néng)夠避免遠程調用(yòng)的(de)開(kāi)銷。請考慮下面的(de)代碼。

PayBeanHome home = (PayBeanHome)
javax.rmi.PortableRemoteObject.narrow
(ctx.lookup ("PayBeanHome"), PayBeanHome.class);
PayBean bean = (PayBean)
javax.rmi.PortableRemoteObject.narrow
(home.create(), PayBean.class);

  第一個(gè)語句表示我們要尋找Bean的(de)Home接口。這個(gè)查找通過JNDI進行(xíng),它是一個(gè)RMI調用(yòng)。然後,我們定位遠程對象,返回代理(lǐ)引用(yòng),這也(yě)是一個(gè) RMI調用(yòng)。第二個(gè)語句示範了如(rú)何創建一個(gè)實例,涉及了創建IIOP請求并在網絡上(shàng)傳輸請求的(de)stub程序,它也(yě)是一個(gè)RMI調用(yòng)。

  要實現本地(dì)接口,我們必須作如(rú)下修改:

  方法不能(néng)再抛出java.rmi.RemoteException異常,包括從RemoteException派生的(de)異常,比如(rú) TransactionRequiredException、TransactionRolledBackException和(hé) NoSuchObjectException。EJB提供了等價的(de)本地(dì)異常,如(rú)TransactionRequiredLocalException、 TransactionRolledBackLocalException和(hé)NoSuchObjectLocalException。

  所有(yǒu)數據和(hé)返回值都(dōu)通過引用(yòng)的(de)方式傳遞,而不是傳遞值。
  本地(dì)接口必須在EJB部署的(de)機器(qì)上(shàng)使用(yòng)。簡而言之,客戶程序和(hé)提供服務的(de)組件(jiàn)必須在同一個(gè)JVM上(shàng)運行(xíng)。
  如(rú)果Bean實現了本地(dì)接口,則其引用(yòng)不可(kě)串行(xíng)化。
  請參見《用(yòng)本地(dì)引用(yòng)提高(gāo)EJB訪問效率》。

2.7 生成主鍵
  在EJB之内生成主鍵有(yǒu)許多途徑,下面分(fēn)析了幾種常見的(de)辦法以及它們的(de)特點。

  利用(yòng)數據庫内建的(de)标識機制(zhì)(SQL Server的(de)IDENTITY或Oracle的(de)SEQUENCE)。這種方法的(de)缺點是EJB可(kě)移植性


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号