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