馮永亮,王 茹
(1.西安文理學(xué)院數(shù)學(xué)與計(jì)算機(jī)工程學(xué)院,陜西西安,710065)
(2.西安軍需工業(yè)學(xué)校,陜西西安,710068)
作為Java EE 技術(shù)框架中的核心服務(wù)技術(shù),JDBC(Java Database Connectivity,Java 數(shù)據(jù)庫(kù)連接)提供了Java 程序與數(shù)據(jù)庫(kù)之間的連接服務(wù)。
JDBC 體系結(jié)構(gòu)主要由以下幾層構(gòu)成:Java Application 層,JDBC API 層、JDBC Driver Manager 層和Database 層,如圖1所示。其中,Java Application 層包括Java 應(yīng)用程序和Java小應(yīng)用程序。JDBC API 層屏蔽了不同數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序之間的差別,為在Java 中訪問(wèn)任意類型的數(shù)據(jù)庫(kù)提供了技術(shù)支持。JDBC Driver Manager 層能夠動(dòng)態(tài)的管理和維護(hù)數(shù)據(jù)庫(kù)查詢所需的驅(qū)動(dòng)程序?qū)ο螅M(jìn)而實(shí)現(xiàn)程序與特定驅(qū)動(dòng)程序的連接。Database Driver 將應(yīng)用程序數(shù)據(jù)處理要求,轉(zhuǎn)換為DBMS 能夠理解的命令。Database 層包括要訪問(wèn)的數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)管理系統(tǒng)。
圖1 JDBC 兩層結(jié)構(gòu)
目前,JDBC 驅(qū)動(dòng)程序采用四種工作方式:JDBC-ODBC 橋驅(qū)動(dòng)、本地API 驅(qū)動(dòng)、網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)和本地協(xié)議驅(qū)動(dòng)。
此種方式下,JDBC 只需要連接到ODBC,通過(guò)ODBC 可以連接到ODBC 支持的任意一種數(shù)據(jù)庫(kù),這種連接方式叫做JDBC-ODBC橋。在圖1 中的JDBC Driver Manager 層和Database Driver 層之間,增加了JDBC-ODBC Bridge 層和ODBC Driver 層,就構(gòu)成了JDBC-ODBC 橋驅(qū)動(dòng)結(jié)構(gòu)。使用JDBC-ODBC 橋方式的核心代碼是:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Connectionconn=Driver Manager.getConnection(“jdbc:odbc:數(shù)據(jù)源名稱”);
該驅(qū)動(dòng)的優(yōu)勢(shì)在于:只要本地機(jī)裝有ODBC 驅(qū)動(dòng),采用JDBCODBC 橋幾乎可以訪問(wèn)所有的數(shù)據(jù)庫(kù)。但是,由于JDBC-ODBC 先調(diào)用ODBC,再由ODBC 去調(diào)用本地?cái)?shù)據(jù)庫(kù)接口訪問(wèn)數(shù)據(jù)庫(kù)。執(zhí)行效率比較低,對(duì)于那些大數(shù)據(jù)量存取的應(yīng)用是不適合的。
本地API 驅(qū)動(dòng)方式通過(guò)在客戶端加載數(shù)據(jù)庫(kù)廠商提供的本地代碼庫(kù)來(lái)訪問(wèn)數(shù)據(jù)庫(kù),而在驅(qū)動(dòng)程序中則包含了Java 代碼。這種驅(qū)動(dòng)工作方式效率優(yōu)于JDBC-ODBC 橋方式。但是,它仍然需要在客戶端加載數(shù)據(jù)庫(kù)廠商提供的代碼庫(kù),不適合基于Internet 的應(yīng)用。本地API 驅(qū)動(dòng)工作方式在圖1 中的JDBC Driver Manager 層和Database Driver 層之間,增加了Native-API Driver 層。
使用本地API 驅(qū)動(dòng)工作方式,在JDBC 代碼中,設(shè)定特定的驅(qū)動(dòng)程序名稱和url。不同的驅(qū)動(dòng)程序和不同的數(shù)據(jù)庫(kù),應(yīng)采用不同驅(qū)動(dòng)程序名稱和url。以O(shè)racle 為例,核心代碼如下:
這種驅(qū)動(dòng)的機(jī)制是將JDBC 調(diào)用轉(zhuǎn)換為中間網(wǎng)絡(luò)協(xié)議,然后轉(zhuǎn)換為DBMS 協(xié)議。JDBC 先把對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器。中間件服務(wù)器再把請(qǐng)求翻譯為符合數(shù)據(jù)庫(kù)規(guī)范的調(diào)用,再把這種調(diào)用傳給數(shù)據(jù)庫(kù)服務(wù)器。中間網(wǎng)絡(luò)協(xié)議層起到一個(gè)讀取數(shù)據(jù)庫(kù)的中間件的作用,能夠連接許多類型的數(shù)據(jù)庫(kù),因而是最靈活的JDBC 模式。
此方式不需要在客戶端加載數(shù)據(jù)庫(kù)廠商提供的代碼庫(kù),單個(gè)驅(qū)動(dòng)程序可以對(duì)多個(gè)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),可擴(kuò)充性較好。但是,這種驅(qū)動(dòng)在中間件層仍然需要有配置其它數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,并且由于多了一個(gè)中間層傳遞數(shù)據(jù),執(zhí)行效率不是很高。
這種類型的驅(qū)動(dòng)使用Socket,直接在客戶端和數(shù)據(jù)庫(kù)間通信。驅(qū)動(dòng)完全由Java 實(shí)現(xiàn),因此實(shí)現(xiàn)了平臺(tái)獨(dú)立性。
由于這種驅(qū)動(dòng)不需要先把JDBC 的調(diào)用傳給ODBC 或本地?cái)?shù)據(jù)庫(kù)接口或者是中間層服務(wù)器。所以它的執(zhí)行效率是非常高的,訪問(wèn)速度也是最快的,安全性也很好。而且,此方式不需要在客戶端或服務(wù)器端裝載任何的軟件或驅(qū)動(dòng),是最直接的Java 實(shí)現(xiàn)。但是,由于缺乏足夠的文檔和技術(shù)支持,幾乎只有數(shù)據(jù)庫(kù)廠商自己才能提供這種類型的JDBC 驅(qū)動(dòng),同時(shí)也需要針對(duì)不同的數(shù)據(jù)庫(kù)使用不同的驅(qū)動(dòng)程序。
3.1 從需要數(shù)據(jù)量操作的角度來(lái)說(shuō),對(duì)于使用Windows 環(huán)境開(kāi)發(fā)系統(tǒng),或者是較小數(shù)據(jù)量操作的應(yīng)用程序,應(yīng)首先考慮使用JDBC-ODBC 驅(qū)動(dòng)。
3.2 從執(zhí)行效率看,網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)和本地協(xié)議驅(qū)動(dòng)明顯優(yōu)于前兩者,應(yīng)首先考慮。
3.3 從應(yīng)用看,從internet 應(yīng)用看,只能考慮網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)和本地協(xié)議驅(qū)動(dòng),因?yàn)榫W(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)可以把多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)都配置在中間層服務(wù)器,它適合需要同時(shí)連接多個(gè)不同種類的數(shù)據(jù)庫(kù),并且對(duì)并發(fā)連接要求高的應(yīng)用。
3.4 從客戶機(jī)部署看,JDBC-ODBC 橋驅(qū)動(dòng)程序需要在客戶機(jī)上安裝的ODBC 驅(qū)動(dòng)程序,而對(duì)于本地API 驅(qū)動(dòng),供應(yīng)商需要在客戶機(jī)上安裝客戶端庫(kù)。后兩種類型則相對(duì)簡(jiǎn)單一些。
為數(shù)據(jù)庫(kù)中的表T_STUDENT 添加一條學(xué)號(hào)為“0030”,姓名為“王江”,性別為“男”的記錄。
本實(shí)驗(yàn)的核心在于如何選擇合適驅(qū)動(dòng)程序。如果考慮使用本地API 驅(qū)動(dòng)方式,雖然執(zhí)行效率較高,但是需要到數(shù)據(jù)庫(kù)廠商網(wǎng)站下載代碼庫(kù),并對(duì)應(yīng)的代碼庫(kù)安裝到客戶端。如果考慮使用網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng),雖然不需要再客戶端進(jìn)行配置,單個(gè)驅(qū)動(dòng)程序就可以對(duì)多個(gè)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),擴(kuò)充性性好,但是,需要在中間件層配置數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序,執(zhí)行效率也不高。如果考慮使用本地協(xié)議驅(qū)動(dòng)方式,考慮需要足夠的技術(shù)支持,獨(dú)立通過(guò)JAVA 編寫驅(qū)動(dòng)程序,對(duì)于個(gè)人或企業(yè)來(lái)說(shuō),是不現(xiàn)實(shí)的。以上三種方式,對(duì)于實(shí)驗(yàn)來(lái)說(shuō),不是最好的選擇。考慮到實(shí)驗(yàn)室?guī)缀跛械碾娔X都能夠很快實(shí)現(xiàn)ODBC 配置,采用JDBC-ODBC 數(shù)據(jù)驅(qū)動(dòng)方式,利用現(xiàn)有的條件,實(shí)現(xiàn)對(duì)后臺(tái)數(shù)據(jù)庫(kù)的訪問(wèn)時(shí)可行的。
通過(guò)運(yùn)行測(cè)試,證明在此程序中,選用JDBC-ODBC 數(shù)據(jù)驅(qū)動(dòng)方式,能夠完成實(shí)驗(yàn)的基本內(nèi)容,并且,在環(huán)境配置上簡(jiǎn)單可行,執(zhí)行效率適中。
選擇合適的數(shù)據(jù)驅(qū)動(dòng)程序工作方式,有助于有效部署軟件,提高軟件執(zhí)行效率,降低運(yùn)行成本,同時(shí)提高可維護(hù)性。選擇時(shí),需要綜合考慮系統(tǒng)開(kāi)發(fā)環(huán)境、系統(tǒng)規(guī)模、實(shí)施成本、執(zhí)行效率、數(shù)據(jù)庫(kù)特征、可擴(kuò)展性以及對(duì)客戶端的依賴程度等。
[1]靳晉.JDBC 技術(shù)淺析[J],中國(guó)教育技術(shù)裝備,2011(5):91
[2]劉云玉,段中興,原晉鵬.JDBC 數(shù)據(jù)庫(kù)重連機(jī)制的研究與實(shí)現(xiàn)[J],計(jì)算機(jī)應(yīng)用與軟件,2011,28(7)38-40
[3]胡廣沖,李建玉,張志超.基于JDBC+ Struts 的在線考試系統(tǒng)的設(shè)計(jì)[J],計(jì)算機(jī)光盤軟件與應(yīng)用,2012(11):219
[4]張俐.基于Spring 和JDBC 的蔬菜運(yùn)銷管理系統(tǒng)在數(shù)據(jù)持久層的應(yīng)用[J],安徽農(nóng)業(yè)科技,2012,40(7):4401-4403
[5]呂峰,梅細(xì)艷,周曉東 基于JDBC 的數(shù)據(jù)庫(kù)管理及其應(yīng)用[J],武漢理工大學(xué)學(xué)報(bào),2004,24(10):64-66
[6]羅榮,唐學(xué)兵.基于JDBC 的數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)與實(shí)現(xiàn)[J],計(jì)算機(jī)工程,2004,30(9):92-93.
[7]郭廣軍,陳代武,胡玉平,李芝城.基于JDBC 的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)的研究[J],南華大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,19(2):50-54.
[8]李德水,陰國(guó)富.JDBC 體系結(jié)構(gòu)分析[J].電腦開(kāi)發(fā)與應(yīng)用,2006,19(10):55-57.