J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐課件_第1頁
J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐課件_第2頁
J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐課件_第3頁
J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐課件_第4頁
J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐課件_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析2內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)2J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題一:使用Oracle數(shù)據(jù)庫,大于4k的附件上傳有問題,會報(bào)java.sql.SQLException:Connectionresetbypeer:socketwriteerror錯誤解答:附件上傳過程是先上傳到應(yīng)用服務(wù)器,再以二進(jìn)制形式保存到BLOB字段。上傳組件采用SmartUpload,上傳過程沒有問題。問題出在對BLOB字段的操作上,在獲取到附件的流對象后,用PreparedStatement的ps.setBinaryStream(),然后再ps.executeUpdate()。這種方式對小于4k的附件沒有問題,大于4k就會報(bào)錯。解決辦法是在插入BLOB字段值時(shí),要先用SELECTBLOBCOLFROMTABLENAMEFORUPDATE查詢和鎖定該字段,然后再做更新。3J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題一:使J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題二:對OracleBLOB字段的處理問題

解答:在Weblogic中,只能支持weblogic自帶的對OracleBLOB處理的類,而在WebSphere中,只能支持Oracle自帶的處理BLOB的類,因此在程序中根據(jù)條件分支判斷應(yīng)用服務(wù)器的類型來決定用哪個類處理BLOB。

4J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題二:對J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題三:流程定義文件加載問題,加載流程定義文件的過程就是解析并將文件中的流程描述信息提交到數(shù)據(jù)庫表。在一個連接事務(wù)中,如果多次調(diào)用PreparedStatement的addBatch()、executeBatch()方法做批量數(shù)據(jù)更新,會報(bào)oracle.jdbc.dbaccess.DBData.clearItem錯誤。解答:應(yīng)用服務(wù)器中數(shù)據(jù)源的PreparedStatementCacheSize默認(rèn)設(shè)置為10,需要改為0不緩存或者改為100,就可以使用executeBatch()了5J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題三:流J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題一:JSP自定義標(biāo)簽屬性大小寫解答:在使用系統(tǒng)自定義的標(biāo)簽屬性時(shí),屬性名必須嚴(yán)格區(qū)分大小寫,否則JSP編譯不通過。6J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題一:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題二:URL編碼問題,通過單擊打印按鈕請求一些報(bào)表打印頁面時(shí)編譯出錯,會拋出傳入的參數(shù)不合法的異常解答:由于URL編碼格式引起的,如jbtsxf_xfcl_bb.jsp?where=aab001like‘%D’,在URL編碼中以%開頭后面跟兩位16進(jìn)制編碼代表一些特殊字符,這里的%D‘不對應(yīng)任何特殊字符,所以出錯。解決辦法是將URL串中的特殊字符用對應(yīng)的URL編碼代替,如把%用%25代替。具體可以參考以下網(wǎng)址:/support/docview.wss?uid=swg211656817J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題二:UJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題三:文件名的大小寫解答:通過include引入文件時(shí)也要區(qū)分文件路徑的大小寫,系統(tǒng)中絕大部分JSP的head和body開始部分都會引入系統(tǒng)公用的兩個文件,即:/htmlHead.jsp和/bodyStart.jsp,但在不少地方被引用為/htmlhead.jsp和/bodystart.jsp,這在WebSphere上會引起編譯錯誤。8J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題三:文J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題四:JSP標(biāo)準(zhǔn)標(biāo)簽屬性值誤用問題解答:如<jsp:includepage=“a.jsp”flush=“false”/>,flush屬性應(yīng)該只有true和false兩個有效值,如果flush取其它值,JSP編譯也不通過。9J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題四:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題五:JSP中importVector類的問題

解答:在JSP中已經(jīng)import了classA,而classA中已經(jīng)import了Vector,因此JSP里面要應(yīng)用Vector的時(shí)候就沒有再去importVector,導(dǎo)致編譯出錯。

10J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題五:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題六:<jsp:paramname="<%=lshColumn%>"value="<%=lsh%>">

解答:jsp:param里面的name屬性不能使用jsp表達(dá)式賦值,參考jsp1.2specname是不能使用表達(dá)式的。修改name為定義好的字符串常量

11J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題六:<J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題七:某個頁面readfile.jsp有時(shí)候能正常訪問,有時(shí)候出現(xiàn)http404解答:readfile.jsp中需要用到某個htc文件,但該htc文件的路徑有誤導(dǎo)致IE在最后渲染時(shí)提示找不到文件,需要修改htc路徑。12J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題七:某J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題八:某個jsp頁面使用<@includefile="">引入HTML頁面,出現(xiàn)亂碼解答:引入的HTML頁面也必須使用<%@pagecontentType=“text/html;charset=GBK”%>進(jìn)行聲明,由于是靜態(tài)引入方式,修改這些包含頁面后,對原來的jsp也應(yīng)該進(jìn)行重新編譯才能獲得效果。但是只適用于WebSphere6。如果是采用動態(tài)引入方式<jsp:includepage=“”>的話,就不需要手動進(jìn)行重新編譯。13J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題八:某J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題九:在一個jsp頁面中包含下載內(nèi)容,調(diào)用了response.getOutputStream()方法時(shí),拋出exception

解答:在jsp中已經(jīng)隱含一個變量out,相當(dāng)于調(diào)用了response.getPrintWriter(),因此再次調(diào)用response.getOutputStream()時(shí)會拋出輸出流已經(jīng)獲得的異常??梢孕薷拇a,不采用jsp調(diào)用形式,改用servlet直接使用流輸出。

14J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題九:在J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十:不要用關(guān)鍵字來定義變量解答:在執(zhí)行<jsp:includepage=""/>之前,代碼定義一個變量Stringorg;其中org屬于關(guān)鍵字,因此編譯的錯誤!15J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十:不J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十一:JSP中使用ShowModalDialog彈出一個新窗口會造成session丟失

解答:改成用Window.open()16J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十一:J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十二:jsp:forward拋出異常:java.lang.IllegalStateException:jsp.error.attempt_to_clear_flushed_buffer解答:<jsp:forwardpage="/jsp/common/save.jsp"> <jsparamname="BCCP64"value="<%=seqNo%>"/> <jsparamname="returnURL"value="<%=returnURL%>"/> <jsparamname="BAE001"value="<%=OrgCode%>"/></jsp:forward>在有jsp:forward語句的jsp中,不能有其他html的元素的輸出17J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十二:J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-體系架構(gòu)部分問題:在實(shí)現(xiàn)異步消息偵聽的功能時(shí),采用一個非容器受管的線程實(shí)現(xiàn)javax.jms.messageListener接口來完成,并沒有使用MDB,導(dǎo)致在WebSphere上出現(xiàn)異常錯誤,被迫要改成同步偵聽的方式,使性能下降。解答:在J2EE規(guī)范中提倡采用MDB來完成異步消息偵聽的工作,而不接受自己用線程來實(shí)現(xiàn)的做法。這樣做的好處是因?yàn)镸DB是受EJB容器管理的一個組件,開發(fā)和維護(hù)簡單,移植性好。18J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-體系架構(gòu)部分問題:在內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析19內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)19J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源組件問題一:采用SmartUpload組件實(shí)現(xiàn)文件上傳功能,SmartUpload組件本身存在一定的缺陷,容易造成內(nèi)存泄漏。解答:通過對heapdump文件進(jìn)行分析,對系統(tǒng)出現(xiàn)的OutOfMemory現(xiàn)象,是因?yàn)樵赟martUpload中有一段代碼不是十分嚴(yán)密,會在某種情況下出現(xiàn)死循環(huán),然后導(dǎo)致系統(tǒng)內(nèi)存溢出,不能正常提供服務(wù)。

解決的辦法是對SmartUpload的代碼進(jìn)行部分修改,使之不產(chǎn)生死循環(huán)。具體的分析過程請參考附件一。20J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源組件問題一:采用SJ2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題二:某些jdbc語句過于龐大,導(dǎo)致該語句的執(zhí)行時(shí)間過長而鎖住了jdbc連接等資源不被釋放。解答:建議檢查sql語句的效率,把一個語句中執(zhí)行的復(fù)雜操作優(yōu)化成效率高的sql語句來執(zhí)行。selectsqlb,currenthj,currentstate,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbhfromTodolistwheresqlb='101'and(currenthj='001'orcurrenthj='006'orcurrenthj='011'or))and(clr='st001'orclrisnull)and(tbdwbhlike'44%')groupbysqlb,currenthj,currentstate,tbdwbhorderbysqlb,currenthj,currentstate,tbdwbhselectsqlb,currenthj,currentstate,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbhfromTodolistwheresqlb='101'and(currenthjin('001','006','011','016','021','031I1','031I2','031I3','031J1','031J2','031J3','031K1','031K2','031K3','031M1','031M2','031M3','041','050','052','056','061','062','063','066','071','076','078','081','086','087','088','089','090','091','092','096','101','106','108','111'))and(clr='st001'orclrisnull)and(tbdwbhlike'44%')groupbysqlb,currenthj,currentstate,tbdwbhorderbysqlb,currenthj,currentstate,tbdwbh21J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題二:J2EE應(yīng)用上線后遇到的問題總結(jié)問題三:防火墻策略的影響解答:假如應(yīng)用服務(wù)器連接數(shù)據(jù)庫的時(shí)候要通過防火墻的話,那么要仔細(xì)設(shè)置策略中的超時(shí)部分,不要與應(yīng)用服務(wù)器連接數(shù)據(jù)庫的超時(shí)設(shè)置相抵觸。如果防火墻的超時(shí)設(shè)置要短于應(yīng)用服務(wù)器的設(shè)置,那么數(shù)據(jù)庫連接就會被防火墻頻繁的截?cái)?,從而引起性能的下降?2J2EE應(yīng)用上線后遇到的問題總結(jié)問題三:防火墻策略的影響22J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題四:要珍惜jdbc連接資源解答:jdbc連接是非常寶貴的資源,當(dāng)要用到的時(shí)候才去獲取,而不要占住了一個連接卻不使用它,也不要使用完了不釋放它,這樣會使應(yīng)用程序的效率很低??偨Y(jié)來說,就是在初始化的時(shí)候?qū)atasource作一次jndilookup的動作,然后接下來當(dāng)要使用jdbc連接的時(shí)候通過getConnection獲取連接,在使用完畢后通過conn.close()關(guān)閉,使之返回到連接池中被其他代碼使用。23J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題四:J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源框架問題五:慎用各種開源的框架解答:目前各種開源的框架非常流行,例如hibernate,tapestry,struts,spring等等,這些框架使用起來也會簡化開發(fā)的工作量,但是一定要注意這些框架下的合理參數(shù)配置,否則會引起系統(tǒng)級別的性能問題。例如在出入境的性能問題中,基本上都是因?yàn)檫@些框架下的參數(shù)沒有正確的配置引起太多對象堆積在內(nèi)存空間中不能被釋放,造成內(nèi)存泄漏。具體問題的分析辦法請參考附件二和附件三。24J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源框架問題五:慎用各J2EE應(yīng)用上線后遇到的問題總結(jié)問題六:關(guān)于WAS做集群的問題解答:應(yīng)用程序的開發(fā)應(yīng)該與應(yīng)用服務(wù)器的拓?fù)浣Y(jié)構(gòu)相獨(dú)立,而不應(yīng)該成為部署的障礙。例如像廣東省出入境如此龐大的系統(tǒng),總共包括19臺刀片服務(wù)器來運(yùn)行應(yīng)用服務(wù)器,如果能夠建立起集群的環(huán)境,無論從部署、維護(hù)還有性能方面都能大大提高。25J2EE應(yīng)用上線后遇到的問題總結(jié)問題六:關(guān)于WAS做集群的問內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析26內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)26J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分整體考慮開發(fā)應(yīng)遵循標(biāo)準(zhǔn)的軟件工程方法論開發(fā)應(yīng)遵循J2EE規(guī)范開發(fā)盡量使用成熟的框架以及開發(fā)模式變量名、類名、對象名、包名應(yīng)該遵循命名規(guī)范對象的構(gòu)造盡量避免在被經(jīng)常調(diào)用的代碼中創(chuàng)建對象對于集合類(collection),應(yīng)盡量初始化它的大小JVM會自動指定缺省大小如果超過,JVM會重新創(chuàng)建一個,釋放掉原來的對象,加大JVM負(fù)擔(dān)27J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分整體考慮27J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分當(dāng)一個類的多個實(shí)例在其本地的變量里訪問一個特定的對象時(shí),最好將這個變量設(shè)計(jì)為靜態(tài)(static)的,而不是每個實(shí)例中變量里都存放那個對象的引用盡量重用對象的引用,而不是new注意釋放容器對象中所保存的指向別的對象的引用盡量使用primitive數(shù)據(jù)類型當(dāng)只是訪問一個類的某個方法時(shí),不要創(chuàng)建該類的對象,而是將該方法設(shè)計(jì)成一個static的方法。盡量簡化類的繼承關(guān)系和設(shè)計(jì)簡單的構(gòu)造函數(shù)創(chuàng)建簡單數(shù)據(jù)類型的數(shù)組要比初始化一個這樣的數(shù)組快,創(chuàng)建一個復(fù)雜類型的數(shù)組要比克隆一個這樣的數(shù)組快28J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分當(dāng)一個類的多個實(shí)例在其J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分字符串(String)事實(shí):String對象是不可改變的如果字符串在程序中可能被改變,比如增加、接或刪除字符,就應(yīng)使用StringBuffer。創(chuàng)建具有初始大小的StringBuffer對象,盡量重用該對象,而不使用“+”操作分析字符串中的字符時(shí),就不要使用String或StringBuffer,而是使用字符數(shù)組,特別是在循環(huán)中分析字符時(shí)更應(yīng)該如此盡量少用StringTokenizer,它的方法的性能比較差29J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分字符串(String)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分輸入輸出(Input/Output)小塊小塊的讀寫數(shù)據(jù)會非常慢,因此,盡量大塊的讀寫數(shù)據(jù)使用BufferedInputStream和BufferedOutputStream來批處理數(shù)據(jù)以提高性能對象的序列化(serialization)非常影響I/O的性能,盡量少用對不需序列化的類的域使用transient關(guān)鍵字,以減少序列化的數(shù)據(jù)量30J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分輸入輸出(Input/J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分循環(huán)(Loop)循環(huán)常量,在循環(huán)中它的值不會改變,因此,它的值應(yīng)該在循環(huán)外先計(jì)算出來。本地變量(LocalVariable),在方法中使用本地變量比使用對象的屬性消耗較少的資源。在循環(huán)中卻不一樣,因?yàn)檠h(huán)中的代碼要反復(fù)地被運(yùn)行,因此,盡量少地在循環(huán)中創(chuàng)建對象和變量。盡早結(jié)束循環(huán),如果循環(huán)體在滿足一定條件就可以結(jié)束,就應(yīng)盡快結(jié)束。31J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分循環(huán)(Loop)31J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分集合類(Collections)Collection這是集合類的基本接口,它為一組對象提供了一些簡單的方法,List具有可以控制的順序,但并沒有定義或限制按什么排序Set不能包含重復(fù)的元素Map將一個鍵(Key)影射到一個值(Value),不允許有重復(fù)的鍵Vector和ArrayListVector的方法都是同步的(Synchronized),是線程安全的(thread-safe)32J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分集合類(CollectJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好當(dāng)Vector或ArrayList中的元素超過它的初始大小時(shí),Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利于節(jié)約內(nèi)存空間Hashtable和HashMap類似Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是ArrayList和LinkedListArrayList的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object[]33J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分ArrayList的方J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,更像鏈表結(jié)構(gòu)當(dāng)操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時(shí),使用ArrayList會提供比較好的性能當(dāng)操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時(shí),就應(yīng)該使用LinkedList了如果兩種情形交替出現(xiàn),可以考慮使用List這樣的通用接口,而不用關(guān)心具體的實(shí)現(xiàn),由實(shí)現(xiàn)去保證性能34J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分LinkedList的J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分方法(method)Java編譯器會把一些代碼轉(zhuǎn)為代碼嵌入,提高性能Final、static、private同步(Synchronized)使用同步方法比使用非同步方法的性能要低應(yīng)盡量少使用同步方法同步方法的代碼本身就不應(yīng)該再同步了35J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分方法(method)3J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分EJB部分為EJB實(shí)現(xiàn)本地接口 始終通過會話Bean訪問實(shí)體Bean盡量緩存對EJBHome的訪問當(dāng)使用EJB組件時(shí),始終使用會話Facades盡量使用無狀態(tài)會話bean,而不是有狀態(tài)會話bean盡量使用容器管理的事務(wù)36J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分EJB部分36J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分Servlet部分init()做盡可能多的工作只在初始化是執(zhí)行一次盡可能少地使用Synchronize確保不要synchronize整個類不要用任何實(shí)例變量被所有在線的用戶使用不要使用SingleThreadModel雖然是thread-safe,但性能太差…對于非Java群體:不要在cookies中存對象使用HttpSession

代替37J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分Servlet部分37J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分保持盡量少的Java代碼JSP中的Java代碼很難維護(hù)和測試絕對不要將業(yè)務(wù)邏輯放在JSP中編寫helperclasses從數(shù)據(jù)生成HTMLOneofthefewtimesputtinghardcodingHTMLinJavais‘okay’理想情況下只使用“<%=...%>”tags…在每一個JSP只包含用于顯示數(shù)據(jù)的簡單對象有時(shí)稱之為“viewbean”,但不用是一個真的JavaBean限定JSP只做顯示工作,抵制在其中編寫的商業(yè)邏輯的誘惑38J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分38J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分如果在頁面中你要共享組件和項(xiàng)目,使用如下表格E.g.對于菜單,標(biāo)題欄,頁腳,等等可以使用HTML或者JSPinclude指令可以包括靜態(tài)HTML,或者其它JSP不要忘記在整個JSP中使用try/catch如果在JSP中拋出一個異常,它不能被servlet捕獲作為替代,將所有有異議的代碼放在頭部,將這一部分封裝在try/catch中39J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分39J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分?jǐn)?shù)據(jù)庫訪問部分規(guī)格化(Normalization)數(shù)據(jù)庫結(jié)構(gòu)針對常用的SQL操作建立索引,刪除多余的索引盡量使用PreparedStatements合理運(yùn)用PreparedStatement和連接池考慮批量執(zhí)行SQL命令考慮使用數(shù)據(jù)庫存儲過程及時(shí)關(guān)閉不用的Statement、ResultSet、Connection等對象(但不是在finalize方法內(nèi))40J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分?jǐn)?shù)據(jù)庫訪問部分40J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分HttpSession部分確保放在session中的每一個對象要實(shí)現(xiàn)Serializable(orExternalizable)不是必須的,但在分布式應(yīng)用中是一個好的方法避免在session中存放大對象手工使session無效Canonlydothisifapplicationhasexplicit‘logout’function如果在JSP中不需要session,禁用它 <%pagesession=“false”%>41J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分HttpSessionJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分其它JSP中保持盡量少的Java代碼盡可能減少HTTP數(shù)據(jù)傳輸?shù)目偭亢皖l度盡量使用局部變量不要重復(fù)初始化變量只有在必要時(shí)才運(yùn)用線程安全的類在servlet、EJB中不要使用多線程盡量使用日志記錄框架類如log4j輸出跟蹤信息,而不是使用簡單的System.out.println()從正式發(fā)行的軟件中刪除調(diào)試信息42J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分其它42J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分備注:WAS是遵循J2EE標(biāo)準(zhǔn)的成熟的應(yīng)用服務(wù)器(可用性99.999%),其可靠性遠(yuǎn)高于應(yīng)用,在系統(tǒng)出現(xiàn)問題時(shí),請首先考慮應(yīng)用的問題?。?!

43J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分備注:WAS是遵循J2J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分根據(jù)應(yīng)用狀況設(shè)置JAVA堆大小根據(jù)應(yīng)用狀況設(shè)置webcontainerthreadpoolsize大小根據(jù)應(yīng)用狀況設(shè)置ORBthreadpoolsize大小根據(jù)應(yīng)用狀況設(shè)置JDBCconnectionpoolsize大小根據(jù)應(yīng)用狀況設(shè)置JDBCconnection的prefetchsize大小多個應(yīng)用共用jar包時(shí)使用共享庫盡量緩存會話、有狀態(tài)會話beanDM上的結(jié)點(diǎn)數(shù)(Nodes)<30每個節(jié)點(diǎn)上的server數(shù)(Applicationserverspernode)<2044J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分根據(jù)應(yīng)用狀況設(shè)置JJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分每個單元中的server數(shù)(Totalnumberofapplicationserverspercell)<60即總的(applicationserversxnodes)<60每個sever上的應(yīng)用數(shù)(Applicationsperapplicationserver)<100每個應(yīng)用上的EJB數(shù)(EJBsperapplication)<250在生產(chǎn)平臺盡量少打日志具備規(guī)范的生產(chǎn)、測試平臺、生產(chǎn)平臺,最好物理分開,限制可以接觸到生產(chǎn)平臺的人員借助測試工具進(jìn)行大于生產(chǎn)壓力的壓力測試根據(jù)壓力測試結(jié)果,調(diào)整系統(tǒng)參數(shù)、WAS參數(shù),然后繼續(xù)測試以驗(yàn)證調(diào)整效果45J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分每個單元中的serJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分應(yīng)用必須經(jīng)過開發(fā)平臺測試,才能上測試平臺,經(jīng)過測試平臺測試才能正式上生產(chǎn)46J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分應(yīng)用必須經(jīng)過開發(fā)平內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析47內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)47一些例子分析無意識的集合對象保留Vectorv=newVector(10);for(inti=1;i<100;i++){ Objecto=newObject(); v.add(o);

o=null;}問題:上面用的Vector中的臨時(shí)對象Object被釋放了嗎?回答:沒有!48一些例子分析無意識的集合對象保留48一些例子分析顯示的賦Null值起作用嗎?定義:賦空變量是指簡單地將null值顯式地賦值給這個變量,相對于讓該變量的引用失去其作用域最佳實(shí)踐正確地設(shè)置變量的作用域,而不要顯式地賦空它們顯式賦空變量一般應(yīng)該沒有影響但是,在一些場合下會對性能產(chǎn)生巨大的負(fù)面影響例如,迭代的或者遞歸的賦空集合內(nèi)的元素使得這些集合中的對象能夠滿足垃圾收集的條件實(shí)際上是增加了系統(tǒng)的開銷而不是幫助垃圾收集49一些例子分析顯示的賦Null值起作用嗎?49一些例子分析所以前面的例子中,怎么樣才是相對比較好的辦法讓JVM把Vector里面的申請的Object回收?正解:

For(inti=1;i<100;i++){ v.remove(o); }50一些例子分析所以前面的例子中,怎么樣才是相對比較好的辦法讓J一些例子分析局部作用域一個例子publicstaticStringscopingExample(Stringname){StringBuffersb=newStringBuffer();sb.append(“hello”).append(name);returnsb.toString();}

問題:當(dāng)方法執(zhí)行完后,StringBuffer能被回收嗎?靜態(tài)作用域一個例子staticStringBuffersb=newStringBuffer();publicstaticStringscopingExample(Stringname){sb=newStringBuffer();sb.append("hello").append(name);sb.append(",nicetoseeyou!");returnsb.toString();}問題:當(dāng)方法執(zhí)行完后,StringBuffer能被回收嗎?51一些例子分析局部作用域51一些例子分析例子一:當(dāng)該方法執(zhí)行時(shí),運(yùn)行時(shí)棧保留了一個對StringBuffer對象的引用,這個對象是在程序的第一行產(chǎn)生的。在這個方法的整個執(zhí)行期間,棧保存的這個對象引用將會防止該對象被當(dāng)作垃圾。當(dāng)這個方法執(zhí)行完畢,變量sb也就失去了它的作用域,相應(yīng)地運(yùn)行時(shí)棧就會刪除對該StringBuffer對象的引用。于是不再有對該StringBuffer對象的引用,現(xiàn)在它就可以被當(dāng)作垃圾收集了。棧刪除引用的操作就等于在該方法結(jié)束時(shí)將null值賦給變量sb例子二:現(xiàn)在sb是一個靜態(tài)變量,所以只要它所在的類還裝載在Java虛擬機(jī)中,它也將一直存在。該方法執(zhí)行一次,一個新的StringBuffer將被創(chuàng)建并且被sb變量引用。在這種情況下,sb變量以前引用的StringBuffer對象將會死亡,成為垃圾收集的對象。也就是說,這個死亡的StringBuffer對象被程序保留的時(shí)間比它實(shí)際需要保留的時(shí)間長得多-如果再也沒有對該scopingExample方法的調(diào)用,它將會永遠(yuǎn)保留下去52一些例子分析例子一:當(dāng)該方法執(zhí)行時(shí),運(yùn)行時(shí)棧保留了一個對S總結(jié)你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用你不能調(diào)優(yōu)一個壞的應(yīng)用53總結(jié)你不能調(diào)優(yōu)一個壞的應(yīng)用53J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析55內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)2J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題一:使用Oracle數(shù)據(jù)庫,大于4k的附件上傳有問題,會報(bào)java.sql.SQLException:Connectionresetbypeer:socketwriteerror錯誤解答:附件上傳過程是先上傳到應(yīng)用服務(wù)器,再以二進(jìn)制形式保存到BLOB字段。上傳組件采用SmartUpload,上傳過程沒有問題。問題出在對BLOB字段的操作上,在獲取到附件的流對象后,用PreparedStatement的ps.setBinaryStream(),然后再ps.executeUpdate()。這種方式對小于4k的附件沒有問題,大于4k就會報(bào)錯。解決辦法是在插入BLOB字段值時(shí),要先用SELECTBLOBCOLFROMTABLENAMEFORUPDATE查詢和鎖定該字段,然后再做更新。56J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題一:使J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題二:對OracleBLOB字段的處理問題

解答:在Weblogic中,只能支持weblogic自帶的對OracleBLOB處理的類,而在WebSphere中,只能支持Oracle自帶的處理BLOB的類,因此在程序中根據(jù)條件分支判斷應(yīng)用服務(wù)器的類型來決定用哪個類處理BLOB。

57J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題二:對J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題三:流程定義文件加載問題,加載流程定義文件的過程就是解析并將文件中的流程描述信息提交到數(shù)據(jù)庫表。在一個連接事務(wù)中,如果多次調(diào)用PreparedStatement的addBatch()、executeBatch()方法做批量數(shù)據(jù)更新,會報(bào)oracle.jdbc.dbaccess.DBData.clearItem錯誤。解答:應(yīng)用服務(wù)器中數(shù)據(jù)源的PreparedStatementCacheSize默認(rèn)設(shè)置為10,需要改為0不緩存或者改為100,就可以使用executeBatch()了58J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分問題三:流J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題一:JSP自定義標(biāo)簽屬性大小寫解答:在使用系統(tǒng)自定義的標(biāo)簽屬性時(shí),屬性名必須嚴(yán)格區(qū)分大小寫,否則JSP編譯不通過。59J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題一:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題二:URL編碼問題,通過單擊打印按鈕請求一些報(bào)表打印頁面時(shí)編譯出錯,會拋出傳入的參數(shù)不合法的異常解答:由于URL編碼格式引起的,如jbtsxf_xfcl_bb.jsp?where=aab001like‘%D’,在URL編碼中以%開頭后面跟兩位16進(jìn)制編碼代表一些特殊字符,這里的%D‘不對應(yīng)任何特殊字符,所以出錯。解決辦法是將URL串中的特殊字符用對應(yīng)的URL編碼代替,如把%用%25代替。具體可以參考以下網(wǎng)址:/support/docview.wss?uid=swg2116568160J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題二:UJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題三:文件名的大小寫解答:通過include引入文件時(shí)也要區(qū)分文件路徑的大小寫,系統(tǒng)中絕大部分JSP的head和body開始部分都會引入系統(tǒng)公用的兩個文件,即:/htmlHead.jsp和/bodyStart.jsp,但在不少地方被引用為/htmlhead.jsp和/bodystart.jsp,這在WebSphere上會引起編譯錯誤。61J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題三:文J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題四:JSP標(biāo)準(zhǔn)標(biāo)簽屬性值誤用問題解答:如<jsp:includepage=“a.jsp”flush=“false”/>,flush屬性應(yīng)該只有true和false兩個有效值,如果flush取其它值,JSP編譯也不通過。62J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題四:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題五:JSP中importVector類的問題

解答:在JSP中已經(jīng)import了classA,而classA中已經(jīng)import了Vector,因此JSP里面要應(yīng)用Vector的時(shí)候就沒有再去importVector,導(dǎo)致編譯出錯。

63J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題五:JJ2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題六:<jsp:paramname="<%=lshColumn%>"value="<%=lsh%>">

解答:jsp:param里面的name屬性不能使用jsp表達(dá)式賦值,參考jsp1.2specname是不能使用表達(dá)式的。修改name為定義好的字符串常量

64J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題六:<J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題七:某個頁面readfile.jsp有時(shí)候能正常訪問,有時(shí)候出現(xiàn)http404解答:readfile.jsp中需要用到某個htc文件,但該htc文件的路徑有誤導(dǎo)致IE在最后渲染時(shí)提示找不到文件,需要修改htc路徑。65J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題七:某J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題八:某個jsp頁面使用<@includefile="">引入HTML頁面,出現(xiàn)亂碼解答:引入的HTML頁面也必須使用<%@pagecontentType=“text/html;charset=GBK”%>進(jìn)行聲明,由于是靜態(tài)引入方式,修改這些包含頁面后,對原來的jsp也應(yīng)該進(jìn)行重新編譯才能獲得效果。但是只適用于WebSphere6。如果是采用動態(tài)引入方式<jsp:includepage=“”>的話,就不需要手動進(jìn)行重新編譯。66J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題八:某J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題九:在一個jsp頁面中包含下載內(nèi)容,調(diào)用了response.getOutputStream()方法時(shí),拋出exception

解答:在jsp中已經(jīng)隱含一個變量out,相當(dāng)于調(diào)用了response.getPrintWriter(),因此再次調(diào)用response.getOutputStream()時(shí)會拋出輸出流已經(jīng)獲得的異常??梢孕薷拇a,不采用jsp調(diào)用形式,改用servlet直接使用流輸出。

67J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題九:在J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十:不要用關(guān)鍵字來定義變量解答:在執(zhí)行<jsp:includepage=""/>之前,代碼定義一個變量Stringorg;其中org屬于關(guān)鍵字,因此編譯的錯誤!68J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十:不J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十一:JSP中使用ShowModalDialog彈出一個新窗口會造成session丟失

解答:改成用Window.open()69J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十一:J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十二:jsp:forward拋出異常:java.lang.IllegalStateException:jsp.error.attempt_to_clear_flushed_buffer解答:<jsp:forwardpage="/jsp/common/save.jsp"> <jsparamname="BCCP64"value="<%=seqNo%>"/> <jsparamname="returnURL"value="<%=returnURL%>"/> <jsparamname="BAE001"value="<%=OrgCode%>"/></jsp:forward>在有jsp:forward語句的jsp中,不能有其他html的元素的輸出70J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分問題十二:J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-體系架構(gòu)部分問題:在實(shí)現(xiàn)異步消息偵聽的功能時(shí),采用一個非容器受管的線程實(shí)現(xiàn)javax.jms.messageListener接口來完成,并沒有使用MDB,導(dǎo)致在WebSphere上出現(xiàn)異常錯誤,被迫要改成同步偵聽的方式,使性能下降。解答:在J2EE規(guī)范中提倡采用MDB來完成異步消息偵聽的工作,而不接受自己用線程來實(shí)現(xiàn)的做法。這樣做的好處是因?yàn)镸DB是受EJB容器管理的一個組件,開發(fā)和維護(hù)簡單,移植性好。71J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-體系架構(gòu)部分問題:在內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析72內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)19J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源組件問題一:采用SmartUpload組件實(shí)現(xiàn)文件上傳功能,SmartUpload組件本身存在一定的缺陷,容易造成內(nèi)存泄漏。解答:通過對heapdump文件進(jìn)行分析,對系統(tǒng)出現(xiàn)的OutOfMemory現(xiàn)象,是因?yàn)樵赟martUpload中有一段代碼不是十分嚴(yán)密,會在某種情況下出現(xiàn)死循環(huán),然后導(dǎo)致系統(tǒng)內(nèi)存溢出,不能正常提供服務(wù)。

解決的辦法是對SmartUpload的代碼進(jìn)行部分修改,使之不產(chǎn)生死循環(huán)。具體的分析過程請參考附件一。73J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源組件問題一:采用SJ2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題二:某些jdbc語句過于龐大,導(dǎo)致該語句的執(zhí)行時(shí)間過長而鎖住了jdbc連接等資源不被釋放。解答:建議檢查sql語句的效率,把一個語句中執(zhí)行的復(fù)雜操作優(yōu)化成效率高的sql語句來執(zhí)行。selectsqlb,currenthj,currentstate,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbhfromTodolistwheresqlb='101'and(currenthj='001'orcurrenthj='006'orcurrenthj='011'or))and(clr='st001'orclrisnull)and(tbdwbhlike'44%')groupbysqlb,currenthj,currentstate,tbdwbhorderbysqlb,currenthj,currentstate,tbdwbhselectsqlb,currenthj,currentstate,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbhfromTodolistwheresqlb='101'and(currenthjin('001','006','011','016','021','031I1','031I2','031I3','031J1','031J2','031J3','031K1','031K2','031K3','031M1','031M2','031M3','041','050','052','056','061','062','063','066','071','076','078','081','086','087','088','089','090','091','092','096','101','106','108','111'))and(clr='st001'orclrisnull)and(tbdwbhlike'44%')groupbysqlb,currenthj,currentstate,tbdwbhorderbysqlb,currenthj,currentstate,tbdwbh74J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題二:J2EE應(yīng)用上線后遇到的問題總結(jié)問題三:防火墻策略的影響解答:假如應(yīng)用服務(wù)器連接數(shù)據(jù)庫的時(shí)候要通過防火墻的話,那么要仔細(xì)設(shè)置策略中的超時(shí)部分,不要與應(yīng)用服務(wù)器連接數(shù)據(jù)庫的超時(shí)設(shè)置相抵觸。如果防火墻的超時(shí)設(shè)置要短于應(yīng)用服務(wù)器的設(shè)置,那么數(shù)據(jù)庫連接就會被防火墻頻繁的截?cái)?,從而引起性能的下降?5J2EE應(yīng)用上線后遇到的問題總結(jié)問題三:防火墻策略的影響22J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題四:要珍惜jdbc連接資源解答:jdbc連接是非常寶貴的資源,當(dāng)要用到的時(shí)候才去獲取,而不要占住了一個連接卻不使用它,也不要使用完了不釋放它,這樣會使應(yīng)用程序的效率很低??偨Y(jié)來說,就是在初始化的時(shí)候?qū)atasource作一次jndilookup的動作,然后接下來當(dāng)要使用jdbc連接的時(shí)候通過getConnection獲取連接,在使用完畢后通過conn.close()關(guān)閉,使之返回到連接池中被其他代碼使用。76J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對數(shù)據(jù)庫的訪問問題四:J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源框架問題五:慎用各種開源的框架解答:目前各種開源的框架非常流行,例如hibernate,tapestry,struts,spring等等,這些框架使用起來也會簡化開發(fā)的工作量,但是一定要注意這些框架下的合理參數(shù)配置,否則會引起系統(tǒng)級別的性能問題。例如在出入境的性能問題中,基本上都是因?yàn)檫@些框架下的參數(shù)沒有正確的配置引起太多對象堆積在內(nèi)存空間中不能被釋放,造成內(nèi)存泄漏。具體問題的分析辦法請參考附件二和附件三。77J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源框架問題五:慎用各J2EE應(yīng)用上線后遇到的問題總結(jié)問題六:關(guān)于WAS做集群的問題解答:應(yīng)用程序的開發(fā)應(yīng)該與應(yīng)用服務(wù)器的拓?fù)浣Y(jié)構(gòu)相獨(dú)立,而不應(yīng)該成為部署的障礙。例如像廣東省出入境如此龐大的系統(tǒng),總共包括19臺刀片服務(wù)器來運(yùn)行應(yīng)用服務(wù)器,如果能夠建立起集群的環(huán)境,無論從部署、維護(hù)還有性能方面都能大大提高。78J2EE應(yīng)用上線后遇到的問題總結(jié)問題六:關(guān)于WAS做集群的問內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)J2EE應(yīng)用上線后遇到的問題總結(jié)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐一些例子分析79內(nèi)容J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)26J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分整體考慮開發(fā)應(yīng)遵循標(biāo)準(zhǔn)的軟件工程方法論開發(fā)應(yīng)遵循J2EE規(guī)范開發(fā)盡量使用成熟的框架以及開發(fā)模式變量名、類名、對象名、包名應(yīng)該遵循命名規(guī)范對象的構(gòu)造盡量避免在被經(jīng)常調(diào)用的代碼中創(chuàng)建對象對于集合類(collection),應(yīng)盡量初始化它的大小JVM會自動指定缺省大小如果超過,JVM會重新創(chuàng)建一個,釋放掉原來的對象,加大JVM負(fù)擔(dān)80J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分整體考慮27J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分當(dāng)一個類的多個實(shí)例在其本地的變量里訪問一個特定的對象時(shí),最好將這個變量設(shè)計(jì)為靜態(tài)(static)的,而不是每個實(shí)例中變量里都存放那個對象的引用盡量重用對象的引用,而不是new注意釋放容器對象中所保存的指向別的對象的引用盡量使用primitive數(shù)據(jù)類型當(dāng)只是訪問一個類的某個方法時(shí),不要創(chuàng)建該類的對象,而是將該方法設(shè)計(jì)成一個static的方法。盡量簡化類的繼承關(guān)系和設(shè)計(jì)簡單的構(gòu)造函數(shù)創(chuàng)建簡單數(shù)據(jù)類型的數(shù)組要比初始化一個這樣的數(shù)組快,創(chuàng)建一個復(fù)雜類型的數(shù)組要比克隆一個這樣的數(shù)組快81J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分當(dāng)一個類的多個實(shí)例在其J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分字符串(String)事實(shí):String對象是不可改變的如果字符串在程序中可能被改變,比如增加、接或刪除字符,就應(yīng)使用StringBuffer。創(chuàng)建具有初始大小的StringBuffer對象,盡量重用該對象,而不使用“+”操作分析字符串中的字符時(shí),就不要使用String或StringBuffer,而是使用字符數(shù)組,特別是在循環(huán)中分析字符時(shí)更應(yīng)該如此盡量少用StringTokenizer,它的方法的性能比較差82J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分字符串(String)J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分輸入輸出(Input/Output)小塊小塊的讀寫數(shù)據(jù)會非常慢,因此,盡量大塊的讀寫數(shù)據(jù)使用BufferedInputStream和BufferedOutputStream來批處理數(shù)據(jù)以提高性能對象的序列化(serialization)非常影響I/O的性能,盡量少用對不需序列化的類的域使用transient關(guān)鍵字,以減少序列化的數(shù)據(jù)量83J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分輸入輸出(Input/J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分循環(huán)(Loop)循環(huán)常量,在循環(huán)中它的值不會改變,因此,它的值應(yīng)該在循環(huán)外先計(jì)算出來。本地變量(LocalVariable),在方法中使用本地變量比使用對象的屬性消耗較少的資源。在循環(huán)中卻不一樣,因?yàn)檠h(huán)中的代碼要反復(fù)地被運(yùn)行,因此,盡量少地在循環(huán)中創(chuàng)建對象和變量。盡早結(jié)束循環(huán),如果循環(huán)體在滿足一定條件就可以結(jié)束,就應(yīng)盡快結(jié)束。84J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分循環(huán)(Loop)31J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分集合類(Collections)Collection這是集合類的基本接口,它為一組對象提供了一些簡單的方法,List具有可以控制的順序,但并沒有定義或限制按什么排序Set不能包含重復(fù)的元素Map將一個鍵(Key)影射到一個值(Value),不允許有重復(fù)的鍵Vector和ArrayListVector的方法都是同步的(Synchronized),是線程安全的(thread-safe)85J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分集合類(CollectJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好當(dāng)Vector或ArrayList中的元素超過它的初始大小時(shí),Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利于節(jié)約內(nèi)存空間Hashtable和HashMap類似Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是ArrayList和LinkedListArrayList的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object[]86J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分ArrayList的方J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,更像鏈表結(jié)構(gòu)當(dāng)操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時(shí),使用ArrayList會提供比較好的性能當(dāng)操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時(shí),就應(yīng)該使用LinkedList了如果兩種情形交替出現(xiàn),可以考慮使用List這樣的通用接口,而不用關(guān)心具體的實(shí)現(xiàn),由實(shí)現(xiàn)去保證性能87J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分LinkedList的J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分方法(method)Java編譯器會把一些代碼轉(zhuǎn)為代碼嵌入,提高性能Final、static、private同步(Synchronized)使用同步方法比使用非同步方法的性能要低應(yīng)盡量少使用同步方法同步方法的代碼本身就不應(yīng)該再同步了88J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分方法(method)3J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分EJB部分為EJB實(shí)現(xiàn)本地接口 始終通過會話Bean訪問實(shí)體Bean盡量緩存對EJBHome的訪問當(dāng)使用EJB組件時(shí),始終使用會話Facades盡量使用無狀態(tài)會話bean,而不是有狀態(tài)會話bean盡量使用容器管理的事務(wù)89J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分EJB部分36J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分Servlet部分init()做盡可能多的工作只在初始化是執(zhí)行一次盡可能少地使用Synchronize確保不要synchronize整個類不要用任何實(shí)例變量被所有在線的用戶使用不要使用SingleThreadModel雖然是thread-safe,但性能太差…對于非Java群體:不要在cookies中存對象使用HttpSession

代替90J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分Servlet部分37J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分保持盡量少的Java代碼JSP中的Java代碼很難維護(hù)和測試絕對不要將業(yè)務(wù)邏輯放在JSP中編寫helperclasses從數(shù)據(jù)生成HTMLOneofthefewtimesputtinghardcodingHTMLinJavais‘okay’理想情況下只使用“<%=...%>”tags…在每一個JSP只包含用于顯示數(shù)據(jù)的簡單對象有時(shí)稱之為“viewbean”,但不用是一個真的JavaBean限定JSP只做顯示工作,抵制在其中編寫的商業(yè)邏輯的誘惑91J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分38J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分如果在頁面中你要共享組件和項(xiàng)目,使用如下表格E.g.對于菜單,標(biāo)題欄,頁腳,等等可以使用HTML或者JSPinclude指令可以包括靜態(tài)HTML,或者其它JSP不要忘記在整個JSP中使用try/catch如果在JSP中拋出一個異常,它不能被servlet捕獲作為替代,將所有有異議的代碼放在頭部,將這一部分封裝在try/catch中92J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分JSP部分39J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分?jǐn)?shù)據(jù)庫訪問部分規(guī)格化(Normalization)數(shù)據(jù)庫結(jié)構(gòu)針對常用的SQL操作建立索引,刪除多余的索引盡量使用PreparedStatements合理運(yùn)用PreparedStatement和連接池考慮批量執(zhí)行SQL命令考慮使用數(shù)據(jù)庫存儲過程及時(shí)關(guān)閉不用的Statement、ResultSet、Connection等對象(但不是在finalize方法內(nèi))93J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分?jǐn)?shù)據(jù)庫訪問部分40J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分HttpSession部分確保放在session中的每一個對象要實(shí)現(xiàn)Serializable(orExternalizable)不是必須的,但在分布式應(yīng)用中是一個好的方法避免在session中存放大對象手工使session無效Canonlydothisifapplicationhasexplicit‘logout’function如果在JSP中不需要session,禁用它 <%pagesession=“false”%>94J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分HttpSessionJ2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分其它JSP中保持盡量少的Java代碼盡可能減少HTTP數(shù)據(jù)傳輸?shù)目偭亢皖l度盡量使用局部變量不要重復(fù)初始化變量只有在必要時(shí)才運(yùn)用線程安全的類在servlet、EJB中不要使用多線程盡量使用日志記錄框架類如log4j輸出跟蹤信息,而不是使用簡單的System.out.println()從正式發(fā)行的軟件中刪除調(diào)試信息95J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分其它42J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分備注:WAS是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論