<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ZhipSoft.com
        冬去春來
            鄭重聲明:本Blog純屬個人學習、工作需要,記錄相關資料。請不要發(fā)表任何有人身攻擊的言論,謝謝!!www.ZhipSoft.com
    posts - 94,comments - 149,trackbacks - 0

     J2EE中的優(yōu)化方案

    1.使用StringBuffer代替String

    String是用來存儲字符串常量的,如果要執(zhí)行“+”的操作,系統(tǒng)會生成一些臨時的對象,并對這些對象進行管理,造成不必要的開銷。

    如果字符串有連接的操作,替代的做法是用StringBuffer類的append方法。

    當字符串的大小超過缺省16時,代碼實現(xiàn)了容量的擴充,為了避免對象的重新擴展其容量,那么最好用StringBuffer sb=new StringBuffer(30)

    2.優(yōu)化循環(huán)體

    Vector vect = new Vector(1000);
    for( inti=0; i<vect.size(); i++){
     ...
    }

      for循環(huán)部分改寫成:

    int size = vect.size();
    for( int i=0; i>size; i++){
     ...
    }

    如果size=1000,就避免了1000次的size()調(diào)用開銷,避免了重復調(diào)用.

    3.對象的創(chuàng)建

    盡量少用new來初始化一個類的實例,當一個對象是用new進行初始化時,其構造函數(shù)鏈的所有構造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當生成對象后,系統(tǒng)還要花時間進行垃圾回收和處理。

    當new創(chuàng)建對象不可避免時,注意避免多次的使用new初始化一個對象。

    盡量在使用時再創(chuàng)建該對象。

    NewObject object = new NewObject();
    int value;
    if(i>0 )
    {
     value =object.getValue();
    }

      可以修改為:

    int value;
    if(i>0 )
    {
     NewObject object = new NewObject();
     Value =object.getValue();
    }

    4.慎用異常處理

      異常是Java的一種錯誤處理機制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象,并進行相關的處理,造成系統(tǒng)的開銷,所以異常應該用在錯誤處理的情況,不應該用來控制程序流程,流程盡量用while,if等處理。

    在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。

    討論:需要處理的異常處理和不需要處理的異常處理在捕捉異常類型上應該采取什么策略。

    5.變量的使用

       盡量使用局部變量,調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。

    盡量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會隨他的實例而變化,就可以定義為靜態(tài)變量,從而使他所有的實例都共享這個變量。

    (但是靜態(tài)變量不能濫用,如果這個變量用的比較少而聲明成靜態(tài)變量,不僅效率不會提高,還會影響性能)

     

    6.I/O操作

        輸入/輸出(I/O)包括很多方面,我們知道,進行I/O操作是很費系統(tǒng)資源的。程序中應該盡量少用I/O操作。使用時可以注意: . 合理控制輸出函數(shù)System.out.println()對于大多時候是有用的,特別是系統(tǒng)調(diào)試的時候,但也會產(chǎn)生大量的信息出現(xiàn)在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。

        特別是在發(fā)行版中,要合理的控制輸出,可以在項目開發(fā)時,設計好一個Debug的工具類,在該類中可以實現(xiàn)輸出開關,輸出的級別,根據(jù)不同的情況進行不同的輸出的控制。

        我們在調(diào)試程序的時候,我們喜歡用System.out.println()這樣的打印語句來跟蹤我們的錯誤。但在程序發(fā)布的時候我們卻沒有把這樣的語句都刪除掉,在項目的運行中,也會影響效能。

    7.使用緩存

      讀寫內(nèi)存要比讀寫文件要快很多,應盡可能使用緩沖。

      盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進行處理I/O操作。

    同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高。
     
    8.Servlet的效率問題

      Servlet采用請求——響應模式提供Web服務,通過ServletResponse以及ServletRequest這兩個對象來輸出和接收用戶傳遞的參數(shù),在服務器端處理用戶的請求,根據(jù)請求訪問數(shù)據(jù)庫、訪問別的Servlet方法、調(diào)用EJB等等,然后將處理結果返回給客戶端。

      ·盡量不使用同步

    Servlet是多線程的,以處理不同的請求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢了。

    同步大多數(shù)使用在一個完整的事務中,避免事務中多方操作而引起的數(shù)據(jù)不同步現(xiàn)象。能用邏輯控制的盡量的用邏輯控制。

      ·不用保存太多的信息在HttpSession中

      很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網(wǎng)上商店系統(tǒng)會把購物車信息保存在該用戶的Session中,但當存儲大量的信息或是大的對象在會話中是有害的,特別是當系統(tǒng)中用戶的訪問量很大,對內(nèi)存的需求就會很高。

    具體開發(fā)時,在這兩者之間應作好權衡。

    我們在寫web應用時,經(jīng)常只需要request的地方而使用了session,這樣會是效率大大的降低的。但是我們用到了session,在項目的開發(fā)中又不能很好的利用session,這樣對效率都是有影響的。比如說,我們把用戶信息放在了session中,但是我們有時候在判斷用戶是否登錄的時候,我們傾向去數(shù)據(jù)庫里查這個是否有這個用戶,又是用了request,但是這樣是沒有必要的,因為我們只需要判斷session就行了。如果并發(fā)數(shù)量比較大的時候,服務器的負載就會過重。

      ·清除Session

      通常情況,當達到設定的超時時間時,同時有些Session沒有了活動,服務器會釋放這些沒有活動的Session,.. 不過這種情況下,特別是多用戶并訪時,系統(tǒng)內(nèi)存要維護多個的無效Session。

      當用戶退出時,應該手動釋放,回收資源,實現(xiàn)如下:..

    HttpSession theSession = request.getSession();
    // 獲取當前Session
    if(theSession != null){
     theSession.invalidate(); // 使該Session失效
    }

    9.數(shù)據(jù)庫的操作

    在J2EE開發(fā)的應用系統(tǒng)中,數(shù)據(jù)庫訪問一般是個必備的環(huán)節(jié)。數(shù)據(jù)庫用來存儲業(yè)務數(shù)據(jù),供應用程序訪問。

      在Java技術的應用體系中,應用程序是通過JDBC(Java Database Connectivity)實現(xiàn)的接口來訪問數(shù)據(jù)庫的,JDBC支持“建立連接、SQL語句查詢、處理結果”等基本功能。在應用JDBC接口訪問數(shù)據(jù)庫的過程中,只要根據(jù)規(guī)范來實現(xiàn),就可以達到要求的功能。

      但是,有些時候進行數(shù)據(jù)查詢的效率著實讓開發(fā)人員不如所愿,明明根據(jù)規(guī)范編寫的程序,運行效果卻很差,造成整個系統(tǒng)的執(zhí)行效率不高。

      ·使用速度快的JDBC驅(qū)動

      JDBC API包括兩種實現(xiàn)接口形式,一種是純Java實現(xiàn)的驅(qū)動,一種利用ODBC驅(qū)動和數(shù)據(jù)庫客戶端實現(xiàn),具體有四種驅(qū)動模式并各有不同的應用范圍,針對不同的應用開發(fā)要選擇合適的JDBC驅(qū)動,在同一個應用系統(tǒng)中,如果選擇不同的JDBC驅(qū)動,在效率上會有差別。

    例如,有一個企業(yè)應用系統(tǒng),不要求支持不同廠商的數(shù)據(jù)庫,這時就可以選擇模式4的JDBC驅(qū)動,該驅(qū)動一般由數(shù)據(jù)庫廠商實現(xiàn)的基于本地協(xié)議的驅(qū)動,直接調(diào)用數(shù)據(jù)庫管理系統(tǒng)使用的協(xié)議,減少了模式3中的中間層。

      ·使用JDBC連接池

      為了提高訪問數(shù)據(jù)庫的性能,我們還可以使用JDBC 2.0的一些規(guī)范和特性,JDBC是占用資源的,在使用數(shù)據(jù)庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關閉Connection。而我們知道,獲取Connection是比較消耗系統(tǒng)資源的。

      Connection緩沖池是這樣工作的:當一個應用程序關閉一個數(shù)據(jù)庫連接時,這個連接并不真正釋放而是被循環(huán)利用,建立連接是消耗較大的操作,循環(huán)利用連接可以顯著的提高性能,因為可以減少新連接的建立。

      一個通過DataSource獲取緩沖池獲得連接,并連接到一個CustomerDB數(shù)據(jù)源的代碼演示如下:

    Context ctx = new InitialContext();
    DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");
    Connection conn = dataSource.getConnection("password","username");

      ·緩存DataSource

      一個DataSource對象代表一個實際的數(shù)據(jù)源。這個數(shù)據(jù)源可以是從關系數(shù)據(jù)庫到表格形式的文件,完全依賴于它是怎樣實現(xiàn)的,一個數(shù)據(jù)源對象注冊到JNDI名字服務后,應用程序就可以從JNDI服務器上取得該對象,并使用之和數(shù)據(jù)源建立連接。

      通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是占用資源的。

      為了避免再次的JNDI調(diào)用,可以系統(tǒng)中緩存要使用的DataSource。

      ·關閉所有使用的資源

      系統(tǒng)一般是并發(fā)的系統(tǒng),在每次申請和使用完資源后,應該釋放供別人使用,數(shù)據(jù)庫資源每個模式的含義可以參考SUN JDBC的文檔,不同是比較寶貴的,使用完成后應該保證徹底的釋放。

      請看下面的代碼段:

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
     DataSource dataSource = getDataSource();
     // 取的DataSource的方法,實現(xiàn)略。
     conn = datasource.getConnection();
     stmt = conn.createStatement();
     rs = stmt.executeQuery("SELECT * FROM ...");
     ... // 其他處理
     rs.close();
     stmt.close();
     conn.close();
    }catch (SQLException ex) {
     ... // 錯誤處理
    }

      粗看似乎沒有什么問題,也有關閉相關如Connection等系統(tǒng)資源的代碼,但當出現(xiàn)異常后,關閉資源的代碼可能并不被執(zhí)行,為保證資源的確實已被關閉,應該把資源關閉的代碼放到finally塊:

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
     DataSource dataSource = getDataSource();
     // 取的DataSource的方法,實現(xiàn)略。
     conn = datasource.getConnection();
     stmt = conn.createStatement();
     rs = stmt.executeQuery("SELECT * FROM ...");

     ... // 其他處理
    }catch (SQLException ex) {
     ... // 錯誤處理

    }finally{
     if (rs!=null) {
      try {
       rs.close(); // 關閉ResultSet}
      catch (SQLException ex) {
       ... // 錯誤處理
      }
     }

     if (stmt!=null){
      try {
       stmt.close(); // 關閉Statement}
      catch (SQLException ex) {
       ... // 錯誤處理
      }
     }
     if (conn!=null){
      try {
       conn.close(); // 關閉Connection}
      catch (SQLException ex) {
       ... // 錯誤處理
      }
     }
    }

      ·大型數(shù)據(jù)量處理

      當我們在讀取諸如數(shù)據(jù)列表、報表等大量數(shù)據(jù)時,可以發(fā)現(xiàn)使用EJB的方法是非常慢的,這時可以使用直接訪問數(shù)據(jù)庫的方法,用SQL直接存取數(shù)據(jù),從而消除EJB的經(jīng)常開支(例如遠程方法調(diào)用、事務管理和數(shù)據(jù)序列化,對象的構造等)。

      ·緩存經(jīng)常使用的數(shù)據(jù)

      對于構建的業(yè)務系統(tǒng),如果有些數(shù)據(jù)要經(jīng)常要從數(shù)據(jù)庫中讀取,同時,這些數(shù)據(jù)又不經(jīng)常變化,這些數(shù)據(jù)就可以在系統(tǒng)中緩存起來,使用時直接讀取緩存,而不用頻繁的訪問數(shù)據(jù)庫讀取數(shù)據(jù)。

      緩存工作可以在系統(tǒng)初始化時一次性讀取數(shù)據(jù),特別是一些只讀的數(shù)據(jù),當數(shù)據(jù)更新時更新數(shù)據(jù)庫內(nèi)容,同時更新緩存的數(shù)據(jù)值。

    一個例子是,在一套企業(yè)應用系統(tǒng)中,企業(yè)的信息數(shù)據(jù)(如企業(yè)的名稱)在多個業(yè)務應用模塊中使用,這時就可以把這些數(shù)據(jù)緩存起來,需要時直接讀取緩存的企業(yè)信息數(shù)據(jù)。

    我們經(jīng)常使用Hibernate這樣的持久數(shù)據(jù)層的框架,就很好的利用了緩存的作用,所以在一定程度上彌補了封裝而帶來的效率丟失問題。但是在使用緩存的時候應該注意,因為訪問的內(nèi)存數(shù)據(jù)而不是真實的數(shù)據(jù)庫數(shù)據(jù),所以會出現(xiàn)臟讀的情況。同時也并不是所有的東西都應該放在緩存中,不經(jīng)常用到的我們就沒有必要放在緩存中。有時候我們配合xml文件來使用,也不失一種好的方法。

     

    一般意義上說,參與系統(tǒng)運行的代碼都會對性能產(chǎn)生影響,實際應用中應該養(yǎng)成良好的編程規(guī)范、編寫高質(zhì)量的代碼,當系統(tǒng)性能出現(xiàn)問題時,要找到主要影響性能的瓶頸所在,然后集中精力優(yōu)化這些代碼,能達到事半功倍的效果。

      J2EE性能的優(yōu)化包括很多方面的,要達到一個性能優(yōu)良的系統(tǒng),除了關注代碼之外,還應該根據(jù)系統(tǒng)實際的運行情況,從服務器軟硬件環(huán)境、集群技術、系統(tǒng)構架設計、系統(tǒng)部署環(huán)境、數(shù)據(jù)結構、算法設計等方面綜合考慮。

     



            本Blog純屬個人學習、工作需要,記錄相關資料。請不要發(fā)表任何有人身攻擊的言論,謝謝! www.zhipsoft.cn
    posted on 2007-06-12 08:49 ZhipSoft 閱讀(606) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲精品中文字幕无乱码麻豆| 亚洲AV无码一区二区二三区入口| 久久精品国产亚洲av高清漫画| 国产午夜精品免费一区二区三区| 久久精品国产亚洲AV不卡| 一区二区三区免费视频观看| 久久久久亚洲精品无码网址| 国产免费MV大全视频网站| 亚洲夜夜欢A∨一区二区三区| 国产免费AV片在线观看播放| 亚洲高清国产拍精品26U| 久久青草91免费观看| 久久亚洲AV成人出白浆无码国产 | 免费观看的a级毛片的网站| 亚洲色大成网站www| xvideos亚洲永久网址| 国产99久久久国产精免费| 亚洲成A∨人片在线观看不卡| 久久精品电影免费动漫| 亚洲毛片在线免费观看| 亚洲国产另类久久久精品| 中文字幕乱码一区二区免费| 亚洲国产成人精品无码区在线观看 | 91免费资源网站入口| 亚洲色大成网站WWW国产| 亚洲国产精品丝袜在线观看| aa级毛片毛片免费观看久| 亚洲国产成人久久精品影视 | 色偷偷亚洲男人天堂| 亚洲天堂中文字幕在线| 久久一区二区三区免费播放 | 久久国产精品免费| 亚洲视频一区在线观看| 日本大片在线看黄a∨免费 | 一级毛片a女人刺激视频免费| 日本亚洲成高清一区二区三区| xx视频在线永久免费观看| 国产精品久久亚洲一区二区| 亚洲高清国产AV拍精品青青草原| 国产又黄又爽又猛免费app| 免费观看又污又黄在线观看|