版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們

[科普中國]-JDBC驅(qū)動程序

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識科普陣地
收藏

簡介

JDBC(Java Database Connectivity, Java 數(shù) 據(jù) 庫 連 接)是 一 種可用于執(zhí)行 SQL 語句的 Java API(Application Programming Interface, 應(yīng)用程序設(shè)計接口)。它由一些 Java 語言編寫的類和接口組成。JDBC 為數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計接口, 使開發(fā)人員可以用純 Java 語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。JDBC 通過調(diào)用其接口提供的方法, 提供了 Java 應(yīng)用程序與各種數(shù)據(jù)庫服務(wù)器之間的連接服務(wù), 它支持 ANSI SQL- 92 標(biāo)準(zhǔn), 實現(xiàn)了從 Java 程序內(nèi)調(diào)用標(biāo)準(zhǔn)的 SQL 命令對數(shù)據(jù)庫進(jìn)行查詢、插入、刪除和更新等操作, 并確保數(shù)據(jù)事務(wù)的正常進(jìn)行。JDBC API 主要用來連接數(shù)據(jù)庫并通過 SQL 語句操作數(shù)據(jù)庫。它可以執(zhí)行一般的 SQL 語句、動態(tài) SQL 語句及帶 IN 和 OUT參數(shù)的存儲過程。通過使用 JDBC 簡化了開發(fā)數(shù)據(jù)庫應(yīng)用的復(fù)雜度, 加快了開發(fā)速度。開發(fā)人員可以很方便地將 SQL 語句傳送給幾乎任何一種數(shù)據(jù)庫。而且 JDBC 支持所有的操作系統(tǒng), 使得 Java 應(yīng)用程序不再需要為每個應(yīng)用程序編寫額外的驅(qū)動。2.JDBC 的體系結(jié)構(gòu)JDBC 是實現(xiàn) Java 應(yīng)用程序與各種不同數(shù)據(jù)庫對話的一種機(jī)制。JDBC 由兩部分與數(shù)據(jù)庫獨(dú)立的 API 組成, 一部分是面向程序開發(fā)人員的 JDBC API, 另一部分是面向底層的 JDBC Driv-er API。JDBC 提供了一個通用的 JDBC Driver Manger, 用來管理各種數(shù)據(jù)庫軟件商提供的 JDBC 驅(qū)動程序, 從而訪問其數(shù)據(jù)庫。此外, 對沒有提供相應(yīng) JDBC 驅(qū)動程序的數(shù)據(jù)庫系統(tǒng), 開發(fā)了特殊的驅(qū)動程序: JDBC- ODBC 橋, 該驅(qū)動程序支持 JDBC 通過現(xiàn)有的 ODBC 驅(qū)動程序訪問其數(shù)據(jù)庫系統(tǒng)。JDBC 的基本層次結(jié)構(gòu)由 Java 程序、JDBC 驅(qū)動程序管理器、驅(qū)動程序和數(shù)據(jù)庫四部分組成1 。

JDBC驅(qū)動程序根據(jù)訪問數(shù)據(jù)庫的技術(shù)不同, JDBC 驅(qū)動程序相應(yīng)地分為四種類型。不同類型的驅(qū)動程序有著不一樣的特性和使用方法。

分類JDBC-ODBC橋驅(qū)動程序(JDBC-ODBC Bridge Driver)

此類驅(qū)動程序由JDBC-ODBC橋和一個ODBC驅(qū)動程序組成。其工作原理是,通過一段本地C代碼將JDBC調(diào)用轉(zhuǎn)化成ODBC調(diào)用。這一類型必須在本地計算機(jī)上先安裝好ODBC驅(qū)動程序,然后通過JDBC-ODBCBridge的轉(zhuǎn)換,將Java程序中使用的JDBCAPI訪問指令轉(zhuǎn)化成ODBCAPI指令,進(jìn)而通過ODBC驅(qū)動程序調(diào)用本地數(shù)據(jù)庫驅(qū)動代碼完成對數(shù)據(jù)庫的訪問。

部分Java的本地JDBCAPI驅(qū)動程序

JDBC API驅(qū)動程序(Anative API partly Java technology-enabled Driver)此類驅(qū)動程序也必須在本地計算機(jī)上先安裝好特定的驅(qū)動程序(類似ODBC),然后通過PartialJavaJDBCDriver的轉(zhuǎn)換,把Java程序中使用的JDBC API轉(zhuǎn)換成NativeAPI,進(jìn)而存取數(shù)據(jù)庫。

純Java的數(shù)據(jù)庫中間件驅(qū)動程序

純Java的數(shù)據(jù)庫中間件驅(qū)動程序(Pure Java Driver for Database Middleware)使用這類驅(qū)動程序時,不需要在本地計算機(jī)上安裝任何附加軟件,但是必須在安裝數(shù)據(jù)庫管理系統(tǒng)的服務(wù)器端加裝中間件(Middleware),這個中間件負(fù)責(zé)所有存取數(shù)據(jù)庫時必要的轉(zhuǎn)換。其工作原理是:驅(qū)動程序?qū)DBC訪問轉(zhuǎn)換成與數(shù)據(jù)庫無關(guān)的標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議(通常是HTTP或HTTPS)送出,然后再由中間件服務(wù)器將其轉(zhuǎn)換成數(shù)據(jù)庫專用的訪問指令,完成對數(shù)據(jù)庫的操作。中間件服務(wù)器能支持對多種數(shù)據(jù)庫的訪問。

純Java的JDBC驅(qū)動程序

純Java的JDBC驅(qū)動程序(Direct-to-DatabasePureJavaDriver)這類驅(qū)動程序是直接面向數(shù)據(jù)庫的純Java驅(qū)動程序,即所謂的"瘦"驅(qū)動程序。使用這類驅(qū)動程序時無需安裝任何附加的軟件(無論是本地計算機(jī)或是數(shù)據(jù)庫服務(wù)器端),所有存取數(shù)據(jù)庫的操作都直接由JDBC驅(qū)動程序來完成,此類驅(qū)動程序能將JDBC調(diào)用轉(zhuǎn)換成DBMS專用的網(wǎng)絡(luò)協(xié)議,能夠自動識別網(wǎng)絡(luò)協(xié)議下的特殊數(shù)據(jù)庫并能直接創(chuàng)建數(shù)據(jù)連接。

JDBC驅(qū)動程序的選擇在企業(yè)內(nèi)部信息系統(tǒng)中,選擇合適的JDBC驅(qū)動程序,使之符合數(shù)據(jù)庫程序設(shè)計的要求,是提高系統(tǒng)性能必須考慮的一個方面。開發(fā)者選擇一種驅(qū)動時,需要權(quán)衡速度、可靠性和可移植性。不同的應(yīng)用有不同的需要,一個獨(dú)立的圖形程序總要運(yùn)行在Windows系統(tǒng)下,使用第二類驅(qū)動能夠提高速度;一個Applet使用第三類驅(qū)動,可能是要穿過防火墻;一個Servlet要適應(yīng)不同的操作系統(tǒng),則需要使用第四類驅(qū)動。

這四類驅(qū)動程序中,第一類最節(jié)省投資。由于利用了已有的ODBC驅(qū)動程序,開發(fā)人員不必做額外的開發(fā)工作。但是,這種方式的缺點是比較突出的:首先,這種方式由于需要首先把JD-BC操作翻譯成對應(yīng)的ODBC調(diào)用,然后這些調(diào)用又被傳送給ODBC驅(qū)動程序,最后才執(zhí)行數(shù)據(jù)庫的相關(guān)操作,所以性能受到影響,執(zhí)行效率比較低,不適合對大數(shù)據(jù)量存取的應(yīng)用。其次,由于事先需要安裝其他附加的軟件(ODBC驅(qū)動),有損Java數(shù)據(jù)庫程序的兼容性,不具備跨平臺性,不適合基于Internet/Intranet的應(yīng)用。再次,這類驅(qū)動程序不支持完整的Java命令集,而只局限于ODBC驅(qū)動程序的功能。由于以上的缺點,橋接驅(qū)動程序用于已經(jīng)在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。Sun建議第一類驅(qū)動程序只用于原型開發(fā),而不要用于正式的運(yùn)行環(huán)境。

第二種方式具有開放性,其利用多層結(jié)構(gòu),上層用Java實現(xiàn),支持多數(shù)據(jù)庫,下層為本地代碼(包括一些二進(jìn)制代碼和一個輕量的Java庫),加快了執(zhí)行速度,提高了數(shù)據(jù)庫訪問效率。然而,這種方式也有許多缺點:首先,第二類驅(qū)動程序也必須事先安裝其他附加的軟件(網(wǎng)絡(luò)庫),沒有使用純Java的API,很多時候,在體系結(jié)構(gòu)上不能與大型主機(jī)的數(shù)據(jù)源兼容,即使做到了兼容,效果也是不盡人意。其次,本地化的代碼增加了應(yīng)用程序的危險性:如果在本地代碼中存在缺陷,將可能使Java虛擬機(jī)完全垮掉。再次,第二類驅(qū)動程序要求編寫面向特定平臺的代碼,使用這些驅(qū)動程序的開發(fā)者必須及時跟進(jìn)不同數(shù)據(jù)庫廠商針對不同操作系統(tǒng)發(fā)行的各個驅(qū)動程序版本。最后,客戶端裝入的網(wǎng)絡(luò)庫,同樣會影響驅(qū)動程序的性能。由于以上的缺點,使第二類驅(qū)動程序的使用受到了限制。

第三類驅(qū)動程序是由純Java語言開發(fā)而成的,并且中間件也僅需要在服務(wù)器上安裝,不再需要客戶端的本機(jī)代碼,這類驅(qū)動程序的體積最小,效率較高,具有最大的靈活性。而且,此類驅(qū)動采用標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議,可以被防火墻支持,是開發(fā)Applet程序理想的選擇(其實這些驅(qū)動是為Applet特別編寫的),是Internet應(yīng)用理想的解決方案。另外,開發(fā)者還可以利用單一的驅(qū)動程序連接到多種數(shù)據(jù)庫。由于此種JDBC驅(qū)動程序提供了許多企業(yè)級的特征,因而非常適合用戶的特殊用途,如:SSL安全、分布式事務(wù)處理等。如果用戶未來擴(kuò)張應(yīng)用需要多個數(shù)據(jù)庫,則選擇這種方式是最理想的。由于它具有較好的性能和安全性,廣泛應(yīng)用于基于Web的應(yīng)用系統(tǒng)的開發(fā)。其不足之處是:需要在服務(wù)器端安裝中間件,這適當(dāng)影響了驅(qū)動程序的效率。

第四類驅(qū)動程序可能是最佳的JDBC驅(qū)動程序類型。這是一類新型的驅(qū)動程序,它由數(shù)據(jù)庫廠商提供,能夠?qū)崿F(xiàn)對于本公司數(shù)據(jù)庫系統(tǒng)的最優(yōu)化訪問。它無需安裝任何附加軟件,不會增加任何額外開銷,并且由純Java語言開發(fā)而成,允許從客戶機(jī)到數(shù)據(jù)庫服務(wù)器的直接調(diào)用,能夠自動識別網(wǎng)絡(luò)協(xié)議下的特殊數(shù)據(jù)庫并能直接創(chuàng)建數(shù)據(jù)連接,因此這種驅(qū)動程序的效率最高,擁有最佳的兼容性。然而,這種驅(qū)動也有它的不足:首先,由于使用DBMS專用的網(wǎng)絡(luò)協(xié)議,可能不被防火墻支持,在Internet中會存在潛在安全隱患,成為這類驅(qū)動最大的缺陷。其次,不同DBMS的驅(qū)動程序不同,在一個異構(gòu)計算環(huán)境中,驅(qū)動程序的數(shù)量可能會比較多。雖然有以上缺點,但是瑕不掩玉,此類驅(qū)動程序的諸多優(yōu)點使得它的缺點并不突出,在企業(yè)級應(yīng)用軟件中,是應(yīng)優(yōu)先考慮的。因此,一個Servlet程序,要適應(yīng)不同的操作系統(tǒng),最好使用此類驅(qū)動;這種驅(qū)動也非常適合Applet程序,事實證明它能安全通過TCP/IP協(xié)議連接到數(shù)據(jù)庫。

一般情況下,在開發(fā)Applet應(yīng)用程序時,根據(jù)應(yīng)用程序的具體要求和數(shù)據(jù)庫系統(tǒng)的特點,選擇第三類驅(qū)動程序或第四類驅(qū)動程序。

實例類型3 JDBC(java database connectivity)驅(qū)動程序

類型3 JDBC(java database connectivity)驅(qū)動程序是目前應(yīng)用最為廣泛的JDBC驅(qū)動程序,其實現(xiàn)技術(shù)被眾多的驅(qū)動程序開發(fā)團(tuán)體和個人所關(guān)注。目前,眾多數(shù)據(jù)庫廠商只是提供成型的產(chǎn)品,而沒有公開它們的程序?qū)崿F(xiàn)代碼,因此僅憑成型的產(chǎn)品,要想知道類型3 JDBC驅(qū)動程序的實現(xiàn)過程非常困難2。

JDBC驅(qū)動程序由驅(qū)動類和數(shù)據(jù)庫訪問類組成。驅(qū)動類實現(xiàn)JDBC的Drive接口,具有自動注冊功能。數(shù)據(jù)庫訪問類分別實現(xiàn)了JDBC規(guī)范中定義的數(shù)據(jù)庫訪問接口,在JDBC 1.2規(guī)范中主要包含有Connection(連接接口),Statement(語句接口)和ResultSet(結(jié)果集接口)三種接口。JDBC驅(qū)動程序工作過程可分為加載階段、建立連接階段和數(shù)據(jù)訪問階段。其中:加載階段將驅(qū)動類實例注冊到DriverManager(驅(qū)動程序管理器)中,為下一步建立數(shù)據(jù)庫連接作準(zhǔn)備。 Driver-Manager是一個JDBC驅(qū)動程序管理器,所有的驅(qū)動程序使用前都必須在其上登記注冊,它提供對所有已注冊驅(qū)動程序的管理。

建立連接階段將建立數(shù)據(jù)庫連接的請求發(fā)送給DriverManager, DriverManager將根據(jù)接收到的數(shù)據(jù)庫URL地址(不同驅(qū)動程序定義的URL地址的格式不同)選擇合適的數(shù)據(jù)庫驅(qū)動程序,最終由驅(qū)動程序的驅(qū)動類實例創(chuàng)建數(shù)據(jù)庫連接對象。數(shù)據(jù)訪問階段則進(jìn)行真正的數(shù)據(jù)庫操作,通過創(chuàng)建不同的Statement和ResultSet對象以及調(diào)用這些對象的方法來實現(xiàn)。類型3 JDBC驅(qū)動程序在遵守上述工作過程的同時又具有自身的特點,其系統(tǒng)結(jié)構(gòu)見圖

從圖可見,類型3 JDBC驅(qū)動程序為兩層結(jié)構(gòu),它由驅(qū)動程序客戶端程序和驅(qū)動程序服務(wù)器端程序組成??蛻舳酥苯优c用戶交互,它為用戶提供符合JDBC規(guī)范的數(shù)據(jù)庫統(tǒng)一編程接口,客戶端將數(shù)據(jù)庫請求通過特定的網(wǎng)絡(luò)協(xié)議傳送給服務(wù)器。服務(wù)器充當(dāng)中間件的角色,它負(fù)責(zé)接收和處理用戶的請求以及支持對多種數(shù)據(jù)庫的操作。從圖1還可知,類型3 JDBC驅(qū)動程序自身并不直接與數(shù)據(jù)庫交互,而是借助于其他已實現(xiàn)的數(shù)據(jù)庫驅(qū)動程序,成為“雇主”。可以想象,它“雇傭”的數(shù)據(jù)庫驅(qū)動程序越多,則可支持的數(shù)據(jù)庫就越多,“雇傭”的數(shù)據(jù)庫驅(qū)動程序越強(qiáng)大,則類型3JDBC驅(qū)動程序的功能也越強(qiáng)大。除此之外,“雇傭”的數(shù)據(jù)庫驅(qū)動程序的數(shù)量和成員可以動態(tài)改變,以滿足系統(tǒng)擴(kuò)展的需求。類型3 JDBC驅(qū)動程序的這一特性正是它強(qiáng)大的根源所在。