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

下載本文檔

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

文檔簡(jiǎn)介

J2EE應(yīng)用開發(fā)問題總結(jié)及最佳實(shí)踐,2,內(nèi)容,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié) J2EE應(yīng)用上線后遇到的問題總結(jié) J2EE應(yīng)用開發(fā)部署最佳實(shí)踐 一些例子分析,3,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分,問題一:使用Oracle數(shù)據(jù)庫,大于4k的附件上傳有問題,會(huì)報(bào)java.sql.SQLException: Connection reset by peer: socket write error錯(cuò)誤 解答:附件上傳過程是先上傳到應(yīng)用服務(wù)器,再以二進(jìn)制形式保存到BLOB字段。上傳組件采用SmartUpload,上傳過程沒有問題。問題出在對(duì)BLOB字段的操作上,在獲取到附件的流對(duì)象后,用PreparedStatement的ps.setBinaryStream(),然后再ps.executeUpdate()。這種方式對(duì)小于4k的附件沒有問題,大于4k就會(huì)報(bào)錯(cuò)。解決辦法是 在插入BLOB字段值時(shí),要先用SELECT BLOBCOL FROM TABLENAME FOR UPDATE查詢和鎖定該字段,然后再做更新。,4,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分,問題二:對(duì)Oracle BLOB字段的處理問題 解答:在Weblogic中,只能支持weblogic自帶的對(duì)Oracle BLOB處理的類,而在WebSphere中,只能支持Oracle自帶的處理BLOB的類,因此在程序中根據(jù)條件分支判斷應(yīng)用服務(wù)器的類型來決定用哪個(gè)類處理BLOB。,5,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-數(shù)據(jù)庫部分,問題三:流程定義文件加載問題,加載流程定義文件的過程就是解析并將文件中的流程描述信息提交到數(shù)據(jù)庫表。在一個(gè)連接事務(wù)中,如果多次調(diào)用PreparedStatement的addBatch()、executeBatch()方法做批量數(shù)據(jù)更新,會(huì)報(bào)oracle.jdbc.dbaccess.DBData.clearItem錯(cuò)誤。 解答:應(yīng)用服務(wù)器中數(shù)據(jù)源的PreparedStatementCacheSize默認(rèn)設(shè)置為10,需要改為0不緩存或者改為100,就可以使用executeBatch()了,6,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題一:JSP自定義標(biāo)簽屬性大小寫 解答:在使用系統(tǒng)自定義的標(biāo)簽屬性時(shí),屬性名必須嚴(yán)格區(qū)分大小寫,否則JSP編譯不通過。,7,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題二:URL編碼問題,通過單擊打印按鈕請(qǐng)求一些報(bào)表打印頁面時(shí)編譯出錯(cuò),會(huì)拋出傳入的參數(shù)不合法的異常 解答:由于URL編碼格式引起的,如 jbtsxf_xfcl_bb.jsp?where=aab001 like %D,在URL編碼中以%開頭后面跟兩位16進(jìn)制編碼代表一些特殊字符,這里的%D不對(duì)應(yīng)任何特殊字符,所以出錯(cuò)。解決辦法是將URL串中的特殊字符用對(duì)應(yīng)的URL編碼代替,如把%用%25代替。 具體可以參考以下網(wǎng)址:/support/docview.wss?uid=swg21165681,8,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題三:文件名的大小寫 解答:通過include引入文件時(shí)也要區(qū)分文件路徑的大小寫,系統(tǒng)中絕大部分JSP的head和body開始部分都會(huì)引入系統(tǒng)公用的兩個(gè)文件,即:/htmlHead.jsp和/bodyStart.jsp,但在不少地方被引用為/htmlhead.jsp和/bodystart.jsp,這在WebSphere上會(huì)引起編譯錯(cuò)誤。,9,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題四:JSP標(biāo)準(zhǔn)標(biāo)簽屬性值誤用問題 解答:如 ,flush屬性應(yīng)該只有true和false兩個(gè)有效值,如果flush取其它值,JSP編譯也不通過。,10,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題五:JSP中import Vector類的問題 解答:在JSP中已經(jīng)import了class A,而class A中已經(jīng)import了Vector,因此JSP里面要應(yīng)用Vector的時(shí)候就沒有再去import Vector,導(dǎo)致編譯出錯(cuò)。,11,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題六:“ value=“ 解答:jsp: param里面的name屬性不能使用jsp表達(dá)式賦值,參考jsp1.2 spec name是不能使用表達(dá)式的。修改name為定義好的字符串常量,12,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題七:某個(gè)頁面readfile.jsp有時(shí)候能正常訪問,有時(shí)候出現(xiàn)http 404 解答:readfile.jsp中需要用到某個(gè)htc文件,但該htc文件的路徑有誤導(dǎo)致IE在最后渲染時(shí)提示找不到文件,需要修改htc路徑。,13,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題八:某個(gè)jsp頁面使用引入HTML頁面,出現(xiàn)亂碼 解答:引入的HTML頁面也必須使用進(jìn)行聲明,由于是靜態(tài)引入方式,修改這些包含頁面后,對(duì)原來的jsp也應(yīng)該進(jìn)行重新編譯才能獲得效果。但是只適用于WebSphere6。如果是采用動(dòng)態(tài)引入方式的話,就不需要手動(dòng)進(jìn)行重新編譯。,14,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題九:在一個(gè)jsp頁面中包含下載內(nèi)容,調(diào)用了response.getOutputStream()方法時(shí),拋出exception 解答:在jsp中已經(jīng)隱含一個(gè)變量out,相當(dāng)于調(diào)用了response.getPrintWriter(),因此再次調(diào)用response.getOutputStream()時(shí)會(huì)拋出輸出流已經(jīng)獲得的異常??梢孕薷拇a,不采用jsp調(diào)用形式,改用servlet直接使用流輸出。,15,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題十:不要用關(guān)鍵字來定義變量 解答:在執(zhí)行 之前,代碼定義一個(gè)變量String org; 其中org屬于關(guān)鍵字,因此編譯的錯(cuò)誤!,16,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題十一:JSP中使用ShowModalDialog彈出一個(gè)新窗口會(huì)造成session丟失 解答:改成用Window.open(),17,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-JSP部分,問題十二:jsp:forward拋出異常:java.lang.IllegalStateException: jsp.error.attempt_to_clear_flushed_buffer 解答: “/ “/ “/ 在有jsp:forward語句的jsp中,不能有其他html的元素的輸出,18,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié)-體系架構(gòu)部分,問題:在實(shí)現(xiàn)異步消息偵聽的功能時(shí),采用一個(gè)非容器受管的線程實(shí)現(xiàn)javax.jms.messageListener接口來完成,并沒有使用MDB,導(dǎo)致在WebSphere上出現(xiàn)異常錯(cuò)誤,被迫要改成同步偵聽的方式,使性能下降。 解答:在J2EE規(guī)范中提倡采用MDB來完成異步消息偵聽的工作,而不接受自己用線程來實(shí)現(xiàn)的做法。這樣做的好處是因?yàn)镸DB是受EJB容器管理的一個(gè)組件,開發(fā)和維護(hù)簡(jiǎn)單,移植性好。,19,內(nèi)容,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié) J2EE應(yīng)用上線后遇到的問題總結(jié) J2EE應(yīng)用開發(fā)部署最佳實(shí)踐 一些例子分析,20,J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源組件,問題一:采用SmartUpload組件實(shí)現(xiàn)文件上傳功能,SmartUpload組件本身存在一定的缺陷,容易造成內(nèi)存泄漏。 解答:通過對(duì)heapdump文件進(jìn)行分析,對(duì)系統(tǒng)出現(xiàn)的OutOfMemory現(xiàn)象,是因?yàn)樵赟martUpload中有一段代碼不是十分嚴(yán)密,會(huì)在某種情況下出現(xiàn)死循環(huán),然后導(dǎo)致系統(tǒng)內(nèi)存溢出,不能正常提供服務(wù)。 解決的辦法是對(duì)SmartUpload的代碼進(jìn)行部分修改,使之不產(chǎn)生死循環(huán)。 具體的分析過程請(qǐng)參考附件一。,21,J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對(duì)數(shù)據(jù)庫的訪問,問題二:某些jdbc語句過于龐大,導(dǎo)致該語句的執(zhí)行時(shí)間過長(zhǎng)而鎖住了jdbc連接等資源不被釋放。 解答:建議檢查sql語句的效率,把一個(gè)語句中執(zhí)行的復(fù)雜操作優(yōu)化成效率高的sql語句來執(zhí)行。,select sqlb, currenthj, currentstate, sum(jjbs0), sum(jjbs1), sum(jjbs2), sum(tbbs1), tbdwbh from Todolist where sqlb=101 and (currenthj=001 or currenthj=006 or currenthj=011 or .) and (clr=st001 or clr is null) and (tbdwbh like 44%) group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbh,select sqlb, currenthj, currentstate, sum(jjbs0), sum(jjbs1), sum(jjbs2), sum(tbbs1), tbdwbh from Todolist where sqlb=101 and (currenthj in (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 or clr is null) and (tbdwbh like 44%) group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbh,22,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ù)庫連接就會(huì)被防火墻頻繁的截?cái)啵瑥亩鹦阅艿南陆怠?23,J2EE應(yīng)用上線后遇到的問題總結(jié)-優(yōu)化對(duì)數(shù)據(jù)庫的訪問,問題四:要珍惜jdbc連接資源 解答:jdbc連接是非常寶貴的資源,當(dāng)要用到的時(shí)候才去獲取,而不要占住了一個(gè)連接卻不使用它,也不要使用完了不釋放它,這樣會(huì)使應(yīng)用程序的效率很低??偨Y(jié)來說,就是在初始化的時(shí)候?qū)atasource作一次jndi lookup的動(dòng)作,然后接下來當(dāng)要使用jdbc連接的時(shí)候通過getConnection獲取連接,在使用完畢后通過conn.close()關(guān)閉,使之返回到連接池中被其他代碼使用。,24,J2EE應(yīng)用上線后遇到的問題總結(jié)-使用開源框架,問題五:慎用各種開源的框架 解答:目前各種開源的框架非常流行,例如hibernate, tapestry, struts, spring等等,這些框架使用起來也會(huì)簡(jiǎn)化開發(fā)的工作量,但是一定要注意這些框架下的合理參數(shù)配置,否則會(huì)引起系統(tǒng)級(jí)別的性能問題。例如在出入境的性能問題中,基本上都是因?yàn)檫@些框架下的參數(shù)沒有正確的配置引起太多對(duì)象堆積在內(nèi)存空間中不能被釋放,造成內(nèi)存泄漏。 具體問題的分析辦法請(qǐng)參考附件二和附件三。,25,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臺(tái)刀片服務(wù)器來運(yùn)行應(yīng)用服務(wù)器,如果能夠建立起集群的環(huán)境,無論從部署、維護(hù)還有性能方面都能大大提高。,26,內(nèi)容,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié) J2EE應(yīng)用上線后遇到的問題總結(jié) J2EE應(yīng)用開發(fā)部署最佳實(shí)踐 一些例子分析,27,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,整體考慮 開發(fā)應(yīng)遵循標(biāo)準(zhǔn)的軟件工程方法論 開發(fā)應(yīng)遵循J2EE規(guī)范 開發(fā)盡量使用成熟的框架以及開發(fā)模式 變量名、類名、對(duì)象名、包名應(yīng)該遵循命名規(guī)范 對(duì)象的構(gòu)造 盡量避免在被經(jīng)常調(diào)用的代碼中創(chuàng)建對(duì)象 對(duì)于集合類(collection),應(yīng)盡量初始化它的大小 JVM會(huì)自動(dòng)指定缺省大小 如果超過,JVM會(huì)重新創(chuàng)建一個(gè),釋放掉原來的對(duì)象,加大JVM負(fù)擔(dān),28,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,當(dāng)一個(gè)類的多個(gè)實(shí)例在其本地的變量里訪問一個(gè)特定的對(duì)象時(shí),最好將這個(gè)變量設(shè)計(jì)為靜態(tài)(static)的,而不是每個(gè)實(shí)例中變量里都存放那個(gè)對(duì)象的引用盡量重用對(duì)象的引用,而不是new 注意釋放容器對(duì)象中所保存的指向別的對(duì)象的引用 盡量使用primitive數(shù)據(jù)類型 當(dāng)只是訪問一個(gè)類的某個(gè)方法時(shí),不要?jiǎng)?chuàng)建該類的對(duì)象,而是將該方法設(shè)計(jì)成一個(gè)static的方法。 盡量簡(jiǎn)化類的繼承關(guān)系和設(shè)計(jì)簡(jiǎn)單的構(gòu)造函數(shù) 創(chuàng)建簡(jiǎn)單數(shù)據(jù)類型的數(shù)組要比初始化一個(gè)這樣的數(shù)組快,創(chuàng)建一個(gè)復(fù)雜類型的數(shù)組要比克隆一個(gè)這樣的數(shù)組快,29,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,字符串(String) 事實(shí):String對(duì)象是不可改變的 如果字符串在程序中可能被改變,比如增加、接或刪除字符,就應(yīng)使用StringBuffer。創(chuàng)建具有初始大小的StringBuffer對(duì)象,盡量重用該對(duì)象,而不使用“+”操作 分析字符串中的字符時(shí),就不要使用String或StringBuffer,而是使用字符數(shù)組,特別是在循環(huán)中分析字符時(shí)更應(yīng)該如此 盡量少用StringTokenizer,它的方法的性能比較差,30,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,輸入輸出(Input/Output) 小塊小塊的讀寫數(shù)據(jù)會(huì)非常慢,因此,盡量大塊的讀寫數(shù)據(jù) 使用BufferedInputStream和BufferedOutputStream來批處理數(shù)據(jù)以提高性能 對(duì)象的序列化(serialization)非常影響I/O的性能,盡量少用 對(duì)不需序列化的類的域使用transient關(guān)鍵字,以減少序列化的數(shù)據(jù)量,31,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,循環(huán)(Loop) 循環(huán)常量,在循環(huán)中它的值不會(huì)改變,因此,它的值應(yīng)該在循環(huán)外先計(jì)算出來。 本地變量(Local Variable),在方法中使用本地變量比使用對(duì)象的屬性消耗較少的資源。在循環(huán)中卻不一樣,因?yàn)檠h(huán)中的代碼要反復(fù)地被運(yùn)行,因此,盡量少地在循環(huán)中創(chuàng)建對(duì)象和變量。 盡早結(jié)束循環(huán),如果循環(huán)體在滿足一定條件就可以結(jié)束,就應(yīng)盡快結(jié)束。,32,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,集合類(Collections) Collection 這是集合類的基本接口,它為一組對(duì)象提供了一些簡(jiǎn)單的方法, List 具有可以控制的順序,但并沒有定義或限制按什么排序 Set 不能包含重復(fù)的元素 Map 將一個(gè)鍵(Key)影射到一個(gè)值(Value),不允許有重復(fù)的鍵 Vector和ArrayList Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),33,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好 當(dāng)Vector或ArrayList中的元素超過它的初始大小時(shí),Vector會(huì)將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利于節(jié)約內(nèi)存空間 Hashtable和HashMap 類似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是 ArrayList和LinkedList ArrayList的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object,34,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,更像鏈表結(jié)構(gòu) 當(dāng)操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能 當(dāng)操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時(shí),就應(yīng)該使用LinkedList了 如果兩種情形交替出現(xiàn),可以考慮使用List這樣的通用接口,而不用關(guān)心具體的實(shí)現(xiàn),由實(shí)現(xiàn)去保證性能,35,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,方法(method) Java編譯器會(huì)把一些代碼轉(zhuǎn)為代碼嵌入,提高性能 Final、static、private 同步(Synchronized) 使用同步方法比使用非同步方法的性能要低 應(yīng)盡量少使用同步方法 同步方法的代碼本身就不應(yīng)該再同步了,36,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,EJB部分 為EJB實(shí)現(xiàn)本地接口 始終通過會(huì)話Bean訪問實(shí)體Bean 盡量緩存對(duì)EJB Home的訪問 當(dāng)使用 EJB 組件時(shí),始終使用會(huì)話 Facades 盡量使用無狀態(tài)會(huì)話 bean,而不是有狀態(tài)會(huì)話 bean 盡量使用容器管理的事務(wù),37,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,Servlet部分 init()做盡可能多的工作 只在初始化是執(zhí)行一次 盡可能少地使用 Synchronize 確保不要 synchronize 整個(gè)類 不要用任何實(shí)例變量 被所有在線的用戶使用 不要使用SingleThreadModel 雖然是 thread-safe, 但性能太差 對(duì)于非 Java 群體: 不要在 cookies 中存對(duì)象 使用 HttpSession 代替,38,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,JSP部分 保持盡量少的Java代碼 JSP中的Java代碼很難維護(hù)和測(cè)試 絕對(duì)不要將業(yè)務(wù)邏輯放在JSP中 編寫 helper classes 從數(shù)據(jù)生成HTML One of the few times putting hardcoding HTML in Java is okay 理想情況下只使用 “” tags 在每一個(gè)JSP只包含用于顯示數(shù)據(jù)的簡(jiǎn)單對(duì)象 有時(shí)稱之為 “view bean”, 但不用是一個(gè)真的 JavaBean 限定 JSP 只做顯示工作, 抵制在其中編寫的商業(yè)邏輯的誘惑,39,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,JSP部分 如果在頁面中你要共享組件和項(xiàng)目, 使用如下表格 E.g. 對(duì)于菜單, 標(biāo)題欄, 頁腳,等等 可以使用 HTML 或者 JSP include 指令 可以包括靜態(tài) HTML, 或者其它 JSP 不要忘記在整個(gè) JSP 中使用 try/catch 如果在 JSP 中拋出一個(gè)異常, 它不能被 servlet 捕獲 作為替代, 將所有有異議的代碼放在頭部, 將這一部分封裝在try/catch 中,40,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,數(shù)據(jù)庫訪問部分 規(guī)格化(Normalization)數(shù)據(jù)庫結(jié)構(gòu) 針對(duì)常用的SQL操作建立索引,刪除多余的索引 盡量使用Prepared Statements 合理運(yùn)用PreparedStatement和連接池 考慮批量執(zhí)行SQL命令 考慮使用數(shù)據(jù)庫存儲(chǔ)過程 及時(shí)關(guān)閉不用的Statement、ResultSet、Connection等對(duì)象(但不是在finalize方法內(nèi)),41,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,HttpSession部分 確保放在session 中的每一個(gè)對(duì)象要實(shí)現(xiàn) Serializable (or Externalizable) 不是必須的, 但在分布式應(yīng)用中是一個(gè)好的方法 避免在 session 中存放大對(duì)象 手工使 session 無效 Can only do this if application has explicit log out function 如果在JSP中不需要session,禁用它 ,42,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-開發(fā)部分,其它 JSP中保持盡量少的Java代碼 盡可能減少HTTP數(shù)據(jù)傳輸?shù)目偭亢皖l度 盡量使用局部變量 不要重復(fù)初始化變量 只有在必要時(shí)才運(yùn)用線程安全的類 在servlet、EJB中不要使用多線程 盡量使用日志記錄框架類如log4j輸出跟蹤信息,而不是使用簡(jiǎn)單的System.out.println() 從正式發(fā)行的軟件中刪除調(diào)試信息,43,J2EE應(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í),請(qǐng)首先考慮應(yīng)用的問題!,44,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分,根據(jù)應(yīng)用狀況設(shè)置JAVA堆大小 根據(jù)應(yīng)用狀況設(shè)置webcontainer thread pool size大小 根據(jù)應(yīng)用狀況設(shè)置ORB thread pool size大小 根據(jù)應(yīng)用狀況設(shè)置JDBC connection pool size大小 根據(jù)應(yīng)用狀況設(shè)置JDBC connection的prefetch size大小 多個(gè)應(yīng)用共用jar包時(shí)使用共享庫 盡量緩存會(huì)話、有狀態(tài)會(huì)話bean DM上的結(jié)點(diǎn)數(shù)(Nodes) 30 每個(gè)節(jié)點(diǎn)上的server數(shù)(Application servers per node) 20,45,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分,每個(gè)單元中的server數(shù)(Total number of application servers per cell) 60即總的(application servers x nodes) 60 每個(gè)sever上的應(yīng)用數(shù)(Applications per application server) 100 每個(gè)應(yīng)用上的EJB數(shù)(EJBs per application) 250 在生產(chǎn)平臺(tái)盡量少打日志 具備規(guī)范的生產(chǎn)、測(cè)試平臺(tái)、生產(chǎn)平臺(tái),最好物理分開,限制可以接觸到生產(chǎn)平臺(tái)的人員 借助測(cè)試工具進(jìn)行大于生產(chǎn)壓力的壓力測(cè)試 根據(jù)壓力測(cè)試結(jié)果,調(diào)整系統(tǒng)參數(shù)、WAS參數(shù),然后繼續(xù)測(cè)試以驗(yàn)證調(diào)整效果,46,J2EE應(yīng)用開發(fā)部署最佳實(shí)踐-部署管理部分,應(yīng)用必須經(jīng)過開發(fā)平臺(tái)測(cè)試,才能上測(cè)試平臺(tái),經(jīng)過測(cè)試平臺(tái)測(cè)試才能正式上生產(chǎn),47,內(nèi)容,J2EE應(yīng)用開發(fā)和移植中遇到的問題總結(jié) J2EE應(yīng)用上線后遇到的問題總結(jié) J2EE應(yīng)用開發(fā)部署最佳實(shí)踐 一些例子分析,48,一些例子分析,無意識(shí)的集合對(duì)象保留 Vector v=new Vector(10); for (int i=1; i100; i+) Object o=new Object(); v.add(o); o=null; 問題:上面用的Vector中的臨時(shí)對(duì)象Object被釋放了嗎? 回答:沒有!,49,一些例子分析,顯示的賦Null值起作用嗎? 定義:賦空變量是指簡(jiǎn)單地將 null 值顯式地賦值給這個(gè)變量,相對(duì)于讓該變量的引用失去其作用域 最佳實(shí)踐 正確地設(shè)置變量的作用域,而不要顯式地賦空它們 顯式賦空變量一般應(yīng)該沒有影響 但是,在一些場(chǎng)合下會(huì)對(duì)性能產(chǎn)生巨大的負(fù)面影響 例如,迭代的或者遞歸的賦空集合內(nèi)的元素使得這些集合中的對(duì)象能夠滿足垃圾收集的條件 實(shí)際上是增加了系統(tǒng)的開銷而不是幫助垃圾收集,50,一些例子分析,所以前面的例子中,怎么樣才是相對(duì)比較好的辦法讓JVM

溫馨提示

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

評(píng)論

0/150

提交評(píng)論