摘要:訪問數(shù)據(jù)庫是Java應用的重要環(huán)節(jié)。通過選擇合適的驅動程序、采用連接池技術、優(yōu)化SQL語句以及優(yōu)化數(shù)據(jù)庫可以提高Java訪問SQL數(shù)據(jù)庫的效率。
關鍵詞:Java;SQL數(shù)據(jù)庫;優(yōu)化;JDBC
中圖分類號:TP311.13 文獻標識碼:A 文章編號:1007-9599 (2012) 21-0000-02
隨著Java技術的不斷成熟,Java在電子平臺中的應用越來越廣泛。而數(shù)據(jù)庫存儲著大量數(shù)據(jù),訪問數(shù)據(jù)庫的效率非常重要。任何語言想要訪問數(shù)據(jù)庫,必須與數(shù)據(jù)庫建立連接。Java語言通過JDBC訪問數(shù)據(jù)庫,JDBC是用于執(zhí)行SQL語句的Java Api。JDBC可以與數(shù)據(jù)庫建立連接,發(fā)送SQL語句,還可以處理數(shù)據(jù)庫返回的結果。
1 選擇合適的驅動程序
1.1 JDBC-ODBC網(wǎng)橋驅動程序
JDBC-ODBC網(wǎng)橋驅動程序[1]的特點是將JDBC操作轉換成ODBC操作。首先在本地計算機上安裝ODBC驅動程序,然后通過JDBC-ODBC網(wǎng)橋,將Java程序中的JDBC訪問指令轉換為ODBC訪問指令,接著通過ODBC驅動程序完成數(shù)據(jù)庫的訪問。
1.2 JDBC-Native驅動程序
JDBC-Native驅動程序的特點是將JDBC程序編程接口轉換為本地的程序編程接口。JDBC-Native驅動程序也需要在本地計算上安裝好特定的驅動程序。
1.3 純Java的JDBC中間件驅動程序
純Java的JDBC中間件驅動程序不需要在本地計算機上安裝特定的驅動程序,但是需要安裝數(shù)據(jù)庫管理系統(tǒng)服務器的中間件,服務器的中間件可以支持多種數(shù)據(jù)庫的訪問,還可以負責數(shù)據(jù)庫的轉換。首先將JDBC訪問轉換成網(wǎng)絡標準協(xié)議,接著由服務器端的中間件轉換為專用的訪問指令。
1.4 純Java的JDBC驅動程序
純Java的JDBC中間件驅動程序也不需要在本地計算機上安裝特定的驅動程序,由JDBC驅動完成所有的數(shù)據(jù)庫操作。由數(shù)據(jù)庫廠商提供這一類的驅動程序,將JDBC調用轉換為數(shù)據(jù)專用的訪問指令,效率非常高。
JDBC-ODBC網(wǎng)橋驅動程序要求客戶端必須安裝ODBC驅動程序,不適合基于網(wǎng)絡的應用,而且執(zhí)行效率低,也不適合大數(shù)據(jù)量存取的應用;JDBC-Native驅動程序結合其他三種驅動程序的特點,可以利用本地代碼庫加速數(shù)據(jù)庫的訪問,而且支持多數(shù)據(jù)庫,與數(shù)據(jù)庫緊密結合,擴展數(shù)據(jù)庫的性能;純Java的JDBC驅動程序支持多數(shù)據(jù)庫,具有靈活的特點;純Java的JDBC驅動程序和本機數(shù)據(jù)庫緊密結合,是可靠有效的驅動程序,也是企業(yè)的首選軟件。根據(jù)不同情況,采用不同的驅動程序,可以提高訪問數(shù)據(jù)庫的效率。
2 采用連接池技術
Java訪問數(shù)據(jù)庫的時候,需要同時訪問多個不同的數(shù)據(jù)庫。數(shù)據(jù)庫連接是有限資源,一旦某一程序耗盡數(shù)據(jù)庫資源,那么就會影響其他的應用程序。采用連接池技術,使用同一個連接池,訪問不同的數(shù)據(jù)庫,可以有效地節(jié)約資源,提高數(shù)據(jù)庫的訪問效率。
連接池[2]的核心是連接復用。建立一個數(shù)據(jù)庫連接池,負責數(shù)據(jù)庫連接的分配和管理,允許不同的應用程序共享現(xiàn)有的數(shù)據(jù)庫連接,避免數(shù)據(jù)庫的頻繁建立和關閉,使連接池中的連接得到高校的復用。更重要的是通過監(jiān)視數(shù)據(jù)庫連接的使用情況,可以及時對系統(tǒng)的開發(fā)和性能進行調整。
通過使用空閑池可以實現(xiàn)對連接的管理,也就是按照時間將那些已經(jīng)創(chuàng)建卻沒有分配的連接存放到空閑池[3]中。當用戶請求一個連接的時候,系統(tǒng)首先檢查空閑池內的空閑連接。如果空閑池內存在空閑連接,那么就把創(chuàng)建時間最長的那個連接分配出去;如果空閑池內沒有空閑連接,那么就檢查當前的連接池是否允許連接,如果允許,就等待一定時間,如果不允許,就重新建立一個連接,如果等待的時間內連接池內有連接釋放出來,那么就將其分配給用戶,如果等待時間超過預定時間,還沒有連接釋放出來,那么就重新返回。
在多層結構的應用程序中,使用連接池技術,可以提高系統(tǒng)的性能。
3 優(yōu)化SQL數(shù)據(jù)庫
3.1 使用數(shù)據(jù)庫存儲過程
數(shù)據(jù)庫的存儲過程[4]主要是為了完成一組具有特定功能的SQL語句集[5],經(jīng)過編譯之后就可以存儲到數(shù)據(jù)庫中。當創(chuàng)建存儲過程之后,就可以多次調用,比SQL語句的執(zhí)行快很多。
3.2 創(chuàng)建PrepareStatemennt對象
首先,我們來看兩個程序片段:
Code Fragment 1:
String updateString=“UPDATE chengji SET grade=25”+“WHERE Sno LIKE ‘9500%’”;
stmt.exeeuteUpdate(updateString);
Code Fragment 2:
PreparedStatement updateSales=con.prepareStatement(“UPDATE Sno SET grade=? WHERE grade LIKE?”);
updateSales.setInt(1,25);
updateSales.setStfing(2,“9500%”);
updateSales.executeupdateO;
程序片段一是普通的Statement對象,而程序片段二則是PrepareStatemennt對象,PrepareStatemennt對象包含了SQL語句,一般情況下,這個SQL語句已經(jīng)被預編譯過,當執(zhí)行的時候,只需要運行SQL語句就可以了。如果多次執(zhí)行Statement對象,就會降低PrepareStatemennt對象的運行時間,加快數(shù)據(jù)庫的訪問速度,此時只需要改變其中的變量值,就可以執(zhí)行SQL語句了。是否選擇PrepareStatemennt對象,在于SQL語句是否已經(jīng)多次執(zhí)行,而且兩次執(zhí)行的差別只是變量的不同。如果SQL語句執(zhí)行了多次,那么就可以體現(xiàn)PrepareStatemennt對象預編譯的優(yōu)越性,如果SQL語句只執(zhí)行了一次,那么PrepareStatemennt對象就和Statemennt對象沒有任何差別。因此,多次執(zhí)行Statemennt對象,可以創(chuàng)建為PrepareStatemennt對象,提高效率。
3.3 僅選取所需要的行、列
當執(zhí)行SQL查詢[6]的時候,會獲得符合條件的所有記錄。此時,可以通過tatement的setFetchSize()方法設置數(shù)據(jù)緩存。以增量的方式獲取記錄集,從而獲得自己所需要的記錄。當發(fā)送SQL查詢語句的時候,不需要選取數(shù)據(jù)中的全部列,選取單獨的列就可以減少服務器發(fā)送和取出的數(shù)據(jù)量,提高系統(tǒng)的性能。
4 結束語
優(yōu)化Java訪問SQL數(shù)據(jù)庫的效率,應該從優(yōu)化數(shù)據(jù)庫的連接開始,選擇合適的驅動程序,采用連接池技術,并且優(yōu)化數(shù)據(jù)庫。在實際應用中,根據(jù)實際開發(fā)情況,可以研制出更好的優(yōu)化策略,更好地提高數(shù)據(jù)庫訪問效率。另外,提高數(shù)據(jù)訪問效率還可以改善系統(tǒng)硬件設備,采用硬件軟件結合的方式,提高Java訪問數(shù)據(jù)庫的效率。
參考文獻
[1]王長杰,王衛(wèi)華.Java訪問數(shù)據(jù)庫的效率優(yōu)化研究[J].科技信息,2010(34):246-247.
[2]陳舒驊,劉俊.基于JDBC的數(shù)據(jù)庫訪問優(yōu)化策略研究[J].電腦編程技巧與維護,2011(10):102-103.
[3]車玉生,鞠紅.淺談JDBC連接數(shù)據(jù)庫經(jīng)驗技巧[J].中國科技財富,2011(6):79-80.
[4]岐世峰.JDBC訪問數(shù)據(jù)庫的優(yōu)化建議[J].現(xiàn)代計算機(專業(yè)版),2009(11):121-122.
[5]張達敏,陳言君.優(yōu)化J2EE代碼編寫提高軟件性能[J],貴州科學,2009,27(2):89-90.
[6]張洋.JDBC數(shù)據(jù)庫訪問技術[J].電腦編程技巧與維護,2009(22):57-58.
[作者簡介]衣李娜(1974.2-),女,漢族,遼寧省本溪市,職稱:講師,學位:碩士,研究方向為程序設計。