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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

解答:在JSP中已經import了classA,而classA中已經import了Vector,因此JSP里面要應用Vector的時候就沒有再去importVector,導致編譯出錯。

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

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

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

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

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

解答:改成用Window.open()16J2EE應用開發(fā)和移植中遇到的問題總結-JSP部分問題十一:J2EE應用開發(fā)和移植中遇到的問題總結-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應用開發(fā)和移植中遇到的問題總結-JSP部分問題十二:J2EE應用開發(fā)和移植中遇到的問題總結-體系架構部分問題:在實現異步消息偵聽的功能時,采用一個非容器受管的線程實現javax.jms.messageListener接口來完成,并沒有使用MDB,導致在WebSphere上出現異常錯誤,被迫要改成同步偵聽的方式,使性能下降。解答:在J2EE規(guī)范中提倡采用MDB來完成異步消息偵聽的工作,而不接受自己用線程來實現的做法。這樣做的好處是因為MDB是受EJB容器管理的一個組件,開發(fā)和維護簡單,移植性好。18J2EE應用開發(fā)和移植中遇到的問題總結-體系架構部分問題:在內容J2EE應用開發(fā)和移植中遇到的問題總結J2EE應用上線后遇到的問題總結J2EE應用開發(fā)部署最佳實踐一些例子分析19內容J2EE應用開發(fā)和移植中遇到的問題總結19J2EE應用上線后遇到的問題總結-使用開源組件問題一:采用SmartUpload組件實現文件上傳功能,SmartUpload組件本身存在一定的缺陷,容易造成內存泄漏。解答:通過對heapdump文件進行分析,對系統(tǒng)出現的OutOfMemory現象,是因為在SmartUpload中有一段代碼不是十分嚴密,會在某種情況下出現死循環(huán),然后導致系統(tǒng)內存溢出,不能正常提供服務。

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

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

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

o=null;}問題:上面用的Vector中的臨時對象Object被釋放了嗎?回答:沒有!48一些例子分析無意識的集合對象保留48一些例子分析顯示的賦Null值起作用嗎?定義:賦空變量是指簡單地將null值顯式地賦值給這個變量,相對于讓該變量的引用失去其作用域最佳實踐正確地設置變量的作用域,而不要顯式地賦空它們顯式賦空變量一般應該沒有影響但是,在一些場合下會對性能產生巨大的負面影響例如,迭代的或者遞歸的賦空集合內的元素使得這些集合中的對象能夠滿足垃圾收集的條件實際上是增加了系統(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();}

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

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

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

解答:在JSP中已經import了classA,而classA中已經import了Vector,因此JSP里面要應用Vector的時候就沒有再去importVector,導致編譯出錯。

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

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

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

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

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

解答:改成用Window.open()69J2EE應用開發(fā)和移植中遇到的問題總結-JSP部分問題十一:J2EE應用開發(fā)和移植中遇到的問題總結-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應用開發(fā)和移植中遇到的問題總結-JSP部分問題十二:J2EE應用開發(fā)和移植中遇到的問題總結-體系架構部分問題:在實現異步消息偵聽的功能時,采用一個非容器受管的線程實現javax.jms.messageListener接口來完成,并沒有使用MDB,導致在WebSphere上出現異常錯誤,被迫要改成同步偵聽的方式,使性能下降。解答:在J2EE規(guī)范中提倡采用MDB來完成異步消息偵聽的工作,而不接受自己用線程來實現的做法。這樣做的好處是因為MDB是受EJB容器管理的一個組件,開發(fā)和維護簡單,移植性好。71J2EE應用開發(fā)和移植中遇到的問題總結-體系架構部分問題:在內容J2EE應用開發(fā)和移植中遇到的問題總結J2EE應用上線后遇到的問題總結J2EE應用開發(fā)部署最佳實踐一些例子分析72內容J2EE應用開發(fā)和移植中遇到的問題總結19J2EE應用上線后遇到的問題總結-使用開源組件問題一:采用SmartUpload組件實現文件上傳功能,SmartUpload組件本身存在一定的缺陷,容易造成內存泄漏。解答:通過對heapdump文件進行分析,對系統(tǒng)出現的OutOfMemory現象,是因為在SmartUpload中有一段代碼不是十分嚴密,會在某種情況下出現死循環(huán),然后導致系統(tǒng)內存溢出,不能正常提供服務。

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

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

溫馨提示

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

評論

0/150

提交評論