基於JDBC的Web數據庫應用程序性能優化研究

JDBC的結構和應用模式

    JDBC是一種可用於執行SQL語句的Java API,由一些Java語言編寫的類和接口組成。JDBC爲數據庫應用開發人員、數據庫前臺開發人員提供了一種標準的應用程序設計接口,使開發人員可以用純Java語言編寫完整的數據庫應用。通過使用JDBC,開發人員可以很方便的將SQL語句傳送給幾乎任何一種數據庫,有很好的可移植性。JDBC的結構和工作過程如圖2。用JDBC進行數據庫訪問的操作步驟:①引入java.sql與javax.sql軟件包;②裝載JDBC驅動庫;③用Connection接口建立一個到數據庫的連接對象;④通過SQL語句建立一個Statement對象;⑤通過Statement執行數據庫操作;⑥獲取數據庫數據或更新數據庫數據;⑦關閉結果集對象ResultSet、Statement對象與Connection對象。

圖2  JDBC的結構和工作過程

 

    JDBC驅動器可以分爲下面四種:①橋式驅動器,這種驅動器程序使用橋技術將Java應用程序與一個ODBC數據庫連接。這種驅動器先將JDBC轉化爲ODBC驅動,應用程序依賴後者與數據庫通信。橋式驅動器用本地代碼實現,且必須安裝ODBC管理器和配置ODBC驅動。一般不建議使用。②Native-API半Java驅動器,它通過native C語言庫將JDBC調用轉換成對數據庫的客戶API的調用,從而實現與數據庫的通信。這種驅動一部分用Java語言編寫,另一部分用native代碼實現,因而性能相對比純Java實現的驅動器要高,但在使用時,必須安裝一些與平臺有關的代碼。③Net-Protocal全Java驅動器,它通過網絡協議與中間層連接,而中間層可使用任何一種驅動來存取數據庫。適應性好,使用方便靈活。④Native-Protocol全Java驅動器,這類驅動器將JDBC請求轉化爲與數據庫相關的網絡協議,不用藉助任何其他幫助而直接對數據庫進行存取。Net-Protocal全Java驅動器與Native-Protocol全Java驅動器運算速度較快,性能比較好。Net-Protocal全Java驅動器可以藉助於應用服務器所提供連接池技術、緩衝技術、負載均衡技術等,獲得較高的性能,適合於Web應用的開發。

3  優化Statement、ResultSet對象

    與Connection對象一樣,Statement對象是JDBC程序設計中非常重要的對象。它包含了SQL語句的查詢和更新操作。它是操作數據庫數據的載體,在對數據庫的操作中,起着重要的作用。ResultSet對象是執行SQL語句後產生的結果集,通常是數據庫的查詢結果。其信息的形式可以認爲是一張由行和列組成的二維數據表。通過對該結果集的操作,就可以獲取各項數據。

3.1 選擇正確的Statement對象並及時關閉

    在JDBC技術規範中,共有3種不同類型的Statement對象。它們分別是:Statement、PreparedStatement和CallableStatement。 Statement對象用於執行不帶參數的簡單SQL語句;PreparedStatement對象用於執行帶或不帶IN參數的預編譯SQL語句,由於PreparedStatement對象已經預編譯過,所以起執行速度要快於Statement對象。因此,多次執行的SQL語句經常創建爲PreparedStatement對象,可以提高數據庫的總體效率;CallableStatement對象用於執行數據庫已經存儲的調用,存儲過程是由SQL語句和流控制語句書寫的過程程序,這個程序經數據庫編譯和優化後存儲在數據庫服務器中,充分利用存儲過程來完成應用系統的邏輯操作處理可以提高系統的運行性能和可維護性。

3.2 採用合適的方法操作ResultSet對象

    結果集讀取數據的方法主要是getXXX(),其參數可以使用整型表示第幾列,也可以是列名。返回的是對應的XXX的類型的值。使用getString()可以返回所有列的值,不過返回的都是字符串類型的。還可以通過使用getAsciiStream()獲得該列對應的當前行的ascii流。但如果使用的方法與實際的數據域的類型不匹配,那麼系統要將相應的字段數據進行類型轉換,尤其是在查詢返回巨大數據的時候,將會擴大系統開銷,降低應用性能,對應用性能產生很大的影響。因此應儘量使用與數據域類型相匹配的方法獲取所應用的數據域中的數據。

4  合理使用JDBC的數據庫事務操作

    合理使用事務功能促進數據訪問的併發性。爲了保證Web環境下多用戶協調地訪問數據,應注意根據情況使用鎖定管理。JDBC的數據庫操作中,一項事務是由一條或是多條表達式所組成的一個不可分割的工作單元。通過提交commit( )或者回滾rollback( )來結束事務的操作。在JDBC中,事務操作默認是自動提交的。也就是說,一條對數據庫的更新表達式代表一項事務操作,操作完成後,系統將自動調用commit( )來提交,否則將調用rollback( )來回滾。可以通過調用setAutoCommit(false)來禁止自動提交,之後就可以把多個數據庫操作的表達式作爲一個事務,在操作完成後調用commit( )進行整體提交,如果其中一個表達式操作失敗,則不會執行到commit( ),並且將產生響應異常,此時就可以在捕獲異常時調用rollback( )進行回滾。下面的例子演示用於連接MySQL數據庫中使用數據庫事務的基本過程。
    Connection cnt=null;
    String url=”jdbc:mysql://localhost:3306/sdb”;  //sdb爲測試用的數據庫名
    String user=”abc”;
    String pw=”123456”; //abc,pw分別爲測試用的數據庫用戶名和密碼
    try{
            Class.froName(“com.mysql.jdbc.Driver”).newInstance();
//加載MySQL數據庫驅動
            conn=DriverManager.getConnection(url,user,pw);
//獲取數據庫的連接
            conn.setAutoCommit(false);
            stmt=conn.createStatement();
            stmt.executeUpdate(“SQL語句1”);// 數據庫更新操作1
            stmt.executeUpdate(“SQL語句2”);// 數據庫更新操作2
            conn.commit();//事務提交
        }catch(Exception ex){
            ex.printStackTrace();
    try{
           conn.rollback();//操作不成功則回滾
        }catch(Exception e){e. printStackTrace();}
}
    選擇合適的事務隔離層,JDBC API支持事務對數據庫的加鎖,並且提供了5種操作支持、2種加鎖密度。其中5種支持如下:static int TRANSACTION_NONE=0;表示禁止事務操作和加鎖。static int TRANSACTION_READ_ UNCOMMITTED =1;表示允許髒數據讀寫、重複讀寫和影響讀寫。static int TRANSACTION_READ_COMMITTED=2; 表示禁止髒數據讀寫,允許重複讀寫和影響讀寫。static int TRANSACTION_REPEATABLE_READ =4; 表示禁止髒數據讀寫和重複讀寫,允許影響讀寫。static int TRANSACTION_ SERIALIZABLE =8; 表示禁止髒數據讀寫和重複讀寫,允許影響讀寫。

5  採用數據池提高效率

    在使用JDBC對數據庫操作時,創建數據庫連接對絕大多數驅動器而言都是一項昂貴的操作,要消耗一些資源,因此數據庫的連接是一個影響性能的瓶頸。在Web數據庫應用程序中,每一個HTTP請求都需要創建一個新的數據庫連接,這樣會降低程序的使用性能,甚至是Web服務器過載。因此,“開通連接,與數據庫通信,關閉連接”的JDBC編程模式在Web應用程序中並不可取。採用連接池是一種解決以上問題很好的機制,它將若干個開通的數據庫連接保持在一個緩存中,以共程序隨時取用。程序需要時可以從連接池中取出一個連接,服務完畢後再將連接還給連接池。JDBC 2.0 擴展允許請求客戶機透明地共享連接池中的多個連接對象,應用服務器供應商在其內存空間上實現連接池管理器,並根據需要動態地改變池的大小,從而優化資源的使用。以下爲在Tomcat平臺上數據源的調用方法:
    InitialContext tx=new InitialContext();//初始上下文對象
    DataSource datas=( DataSource)tx.lookup(“java:comp/env/jdbc/ sdb”)//獲得數據源對象
    Conn=datas.getConnection();//從數據源連接池中取得一個數據庫連接
連接池的實現未必都有JDBC驅動器開發商提供,可以從第三方得到,甚至程序開發人員可以自己開發。

6  Web數據庫關係數據模型優化

    爲了提高Web數據庫應用系統的性能在優化JDBC的基礎上,可以對數據庫庫的關係模型進性優化。①對關係模式進行逆規範化,當查詢操作涉及多個關係時,對那些使用頻率高、要求響應速度快的查詢操作設計的關係適當合併,以減少對關聯的操作,提高數據庫的響應速率。②對關係模式進行垂直分割,當關系中一部分屬性使用頻率高,而另一部分屬性使用率低,可將關係分解爲兩個關係,降低單位時間內所有應用需要存取的數據量.③對關係模式進行水平分割,即根據關係中某屬性把關係分解成多個關係,這樣能夠在查詢的時候迅速定位,提高查詢速度。比如校學生管理信息管理系統中,定義學生的屬性,學生:(學號,姓名,性別,班級,學院)。因不同的用戶在訪問時關心的是不同學院的學生,所以就可以學院屬性把關係分割爲多個關係。

總結

    本文主要針對目前在Web應用程序開發中使用JDBC技術解決數據庫訪問時,提出瞭解決性能問題的若干方法,並對這些方法的提升Web數據庫性能的原理進行了分析,最後提出了對關係數據模型優化方法,這些技術方法在開發中都得到了驗證,能夠提升Web應用程序在服務上的性能。
發佈了42 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章