JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序種類及選擇
導(dǎo)讀:現(xiàn)在目前數(shù)據(jù)庫驅(qū)動(dòng)程序市場上,JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序主要有四個(gè)類型。這個(gè)四個(gè)類型的驅(qū)動(dòng)程序各有各的特點(diǎn),并不能夠說哪一個(gè)***。數(shù)據(jù)庫管理員需要結(jié)合企業(yè)的實(shí)際情況,才能夠選擇一個(gè)合適的數(shù)據(jù)庫驅(qū)動(dòng)類型。下面筆者就JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序,來談?wù)勥@個(gè)四個(gè)類型的JDBC各具有什么樣的特點(diǎn),適合在什么樣的情況下使用。
類型一:廠商提供專屬JDBC驅(qū)動(dòng)程序
有些廠商如Oracle或者SYBASE,這些數(shù)據(jù)庫廠商他們自己開發(fā)了一些JDBC驅(qū)動(dòng)程序。這個(gè)類型的JDBC驅(qū)動(dòng)程序會(huì)將JDBC調(diào)用直接轉(zhuǎn)換為關(guān)系數(shù)據(jù)庫本身使用的通信協(xié)議。換一句話說,應(yīng)用程序客戶端可以直接與數(shù)據(jù)庫創(chuàng)建連接。這種類型的JDBC驅(qū)動(dòng)程序主要有如下幾個(gè)特點(diǎn)。
一是JDBC驅(qū)動(dòng)程序是數(shù)據(jù)庫廠商提供的,所以應(yīng)用程序可以直接跟數(shù)據(jù)庫進(jìn)行連接,其執(zhí)行性能要比其他類型的JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序要好,比ODBC數(shù)據(jù)庫驅(qū)動(dòng)程序也要好。目前已經(jīng)有很多數(shù)據(jù)庫廠商提供專屬的JDBC驅(qū)動(dòng)程序,如甲骨文公司的Oracle數(shù)據(jù)庫產(chǎn)品,如微軟公司的SQL Server等等。
二是往往這類JDBC驅(qū)動(dòng)程序全部是由JAVA程序開發(fā)的,而不是有C語言開發(fā)的。為此這類驅(qū)動(dòng)程序往往跨平臺(tái)的性能比較好,可以在多個(gè)操作系統(tǒng)平臺(tái)上運(yùn)行。為此如果企業(yè)在Linux等非微軟的操作系統(tǒng)上部署數(shù)據(jù)庫應(yīng)用,那么采用這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序是一個(gè)明智的選擇。
三是這類驅(qū)動(dòng)程序缺乏彈性。由于是數(shù)據(jù)庫廠商自己提供的專屬驅(qū)動(dòng)程序,為此往往只適用于自己的數(shù)據(jù)庫系統(tǒng),甚至只適合某個(gè)版本的數(shù)據(jù)庫系統(tǒng)。如果后臺(tái)數(shù)據(jù)庫換了一個(gè)或者版本升級(jí)了,則就有可能需要更換數(shù)據(jù)庫驅(qū)動(dòng)程序。這一個(gè)缺陷,是限制這個(gè)類型的數(shù)據(jù)庫驅(qū)動(dòng)程序應(yīng)用的***障礙之一。不過根據(jù)筆者的經(jīng)驗(yàn),如果企業(yè)的數(shù)據(jù)庫應(yīng)用主要是在企業(yè)局域網(wǎng)內(nèi)部使用,則這個(gè)問題不會(huì)很大。因?yàn)榇藭r(shí)企業(yè)往往不會(huì)隨意更換數(shù)據(jù)庫系統(tǒng),或者對(duì)數(shù)據(jù)庫系統(tǒng)進(jìn)行升級(jí)。為此也就會(huì)不會(huì)因?yàn)檫@個(gè)數(shù)據(jù)庫驅(qū)動(dòng)程序彈性不好而給日后的工作帶來麻煩。
為此筆者建議,如果企業(yè)的數(shù)據(jù)庫應(yīng)用相對(duì)穩(wěn)定,那么在數(shù)據(jù)庫開發(fā)或者部署的時(shí)候,***使用廠商提供的專屬JDBC驅(qū)動(dòng)程序。因?yàn)檫@個(gè)類型的數(shù)據(jù)庫驅(qū)動(dòng)程序其與數(shù)據(jù)庫之間的連接最直接,其執(zhí)行性能***。不過其前提是數(shù)據(jù)庫廠商提供了這種類型的JDBC驅(qū)動(dòng)程序。據(jù)筆者了解,像開源的MySQL數(shù)據(jù)庫好像還沒有提供專屬的JDBC驅(qū)動(dòng)程序。如果數(shù)據(jù)庫管理員在MySQL數(shù)據(jù)庫平臺(tái)上部署應(yīng)用的話,則即使想采用專屬JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序也是行不通的。此時(shí)可能管理員要采用其他類型的JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序。
類型二:三層式架構(gòu)的JDBC驅(qū)動(dòng)程序
這種三層式架構(gòu)的JDBC驅(qū)動(dòng)程序主要采用間接連接方式來連接數(shù)據(jù)庫。首先JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序會(huì)先將JDBC函數(shù)調(diào)用翻譯成與數(shù)據(jù)庫無關(guān)的網(wǎng)絡(luò)通信協(xié)議。其次由一個(gè)叫做中介層服務(wù)器的部件會(huì)充當(dāng)翻譯家的角色,會(huì)對(duì)這些報(bào)文進(jìn)行翻譯。***JDBC才把這部分內(nèi)容轉(zhuǎn)換成相對(duì)應(yīng)的關(guān)系型數(shù)據(jù)庫通信協(xié)議。也就是說,在客戶端與數(shù)據(jù)庫服務(wù)器之間有一個(gè)中介服務(wù)器的角色,客戶端與服務(wù)器之間的通信需要通過這個(gè)中介服務(wù)器來進(jìn)行。
這個(gè)類型的JDBC數(shù)據(jù)庫驅(qū)動(dòng)類型有如下幾個(gè)特點(diǎn)
一是提供了比較好的擴(kuò)展性。如當(dāng)某些原因下需要更換后臺(tái)數(shù)據(jù)庫的時(shí)候,只需要調(diào)整中介層與數(shù)據(jù)庫之間的JDBC驅(qū)動(dòng)程序即可。而對(duì)于前端的應(yīng)用程序的負(fù)面影響可以降至到***。在大部分情況下,前端的應(yīng)用程序基本上不需要調(diào)整;有些只需要重新指定所采用的后臺(tái)數(shù)據(jù)庫即可。
二是這個(gè)JDBC驅(qū)動(dòng)程序也是***利用JAVA語言進(jìn)行編寫的。為此如果采用的應(yīng)用程序開發(fā)平臺(tái)也是JAVA的話,那么無疑他們之間的兼容性會(huì)很好。所以如果采用的是JDeveloper等JAVA開發(fā)平臺(tái)的話,這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序能夠?yàn)閿?shù)據(jù)庫開發(fā)人員提供比較穩(wěn)定的開發(fā)平臺(tái)。
三是在性能上,其不甚理想。由于采用三層式架構(gòu)的JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序,其需要通過中介服務(wù)器角色來訪問數(shù)據(jù)庫。雖然這種架構(gòu)提供了比較高的擴(kuò)展性,但是其執(zhí)行性能的話就受到了影響。在同等條件下,這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序其執(zhí)行性能沒有專屬JDBC驅(qū)動(dòng)程序好。魚與熊掌不能夠兼得,數(shù)據(jù)庫開發(fā)人員需要在性能與擴(kuò)展性上做出一個(gè)艱難的抉擇。
類型三:客戶端函數(shù)庫類型的數(shù)據(jù)庫驅(qū)動(dòng)程序
通常情況下數(shù)據(jù)庫軟件會(huì)提供一種叫做客戶端函數(shù)庫的組件。這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序就是建立在這個(gè)函數(shù)庫之上的。此時(shí)系統(tǒng)會(huì)先將JDBC調(diào)用轉(zhuǎn)換成數(shù)據(jù)庫的客戶端函數(shù)庫對(duì)應(yīng)的應(yīng)用程序接口(這個(gè)步驟在客戶端上完成),然后再同數(shù)據(jù)庫進(jìn)行連接。這種方式跟三層式架構(gòu)的JDBC驅(qū)動(dòng)程序不同。前者是直接連接數(shù)據(jù)庫的,而后者則是以間接的方式(中間有中介服務(wù)器角色)來連接數(shù)據(jù)庫。對(duì)于這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序有如下幾個(gè)特點(diǎn)。
一是創(chuàng)建于各數(shù)據(jù)庫特有的客戶端函數(shù)庫之上,為此其執(zhí)行性能比較好。通常情況下各個(gè)數(shù)據(jù)庫廠商會(huì)根據(jù)自己數(shù)據(jù)庫軟件的特點(diǎn),開發(fā)客戶端函數(shù)庫。他們?cè)陂_發(fā)這個(gè)函數(shù)庫的同時(shí),本身就考慮到了性能與優(yōu)化方面的問題。而且,這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序又是直接連接數(shù)據(jù)庫的,為此從性能上考慮,其要比三層式架構(gòu)的JDBC驅(qū)動(dòng)程序要好的多。但是反過來說,其執(zhí)行性能在同等條件下仍然趕不上***種專屬JDBC驅(qū)動(dòng)程序。
二是其兼容性差。如果數(shù)據(jù)庫管理員采用這個(gè)類型的數(shù)據(jù)庫驅(qū)動(dòng)程序的話,需要在客戶端上安裝特定的軟件(其中包含有客戶端函數(shù)庫)。而且這個(gè)軟件往往是數(shù)據(jù)庫廠商提供的。不同廠商的數(shù)據(jù)庫軟件其客戶端函數(shù)庫是不同的。為此如果需要更換數(shù)據(jù)庫系統(tǒng)的話,此時(shí)需要同時(shí)更新各個(gè)客戶端的函數(shù)庫。當(dāng)數(shù)據(jù)庫用戶比較多的時(shí)候,這是非常耗時(shí)的一項(xiàng)工作。
三是其不是***的利用JAVA語言編寫。由于客戶端函數(shù)庫中的內(nèi)容很多都是跟數(shù)據(jù)庫的編程平臺(tái)相關(guān)。為此這種類型的JDBC驅(qū)動(dòng)程序不可能***都有JAVA語言來實(shí)現(xiàn)。由于這方面的限制,為此其跟JAVA應(yīng)用程序開發(fā)平臺(tái)的兼容性就沒有以上兩個(gè)類型的驅(qū)動(dòng)程序那么好了。而且能夠提供這種類型的數(shù)據(jù)庫驅(qū)動(dòng)程序的廠商也不是很多。如好像微軟的SQL SERVER等數(shù)據(jù)庫系統(tǒng)也沒有提供這方面的JDBC驅(qū)動(dòng)程序。所以從應(yīng)用層面考慮,這種數(shù)據(jù)庫驅(qū)動(dòng)類型是使用的最少的。
類型四:橋接型的JDBC驅(qū)動(dòng)程序
有些應(yīng)用系統(tǒng),以前是在ODBC數(shù)據(jù)庫啟動(dòng)程序上面開發(fā)的;而現(xiàn)在數(shù)據(jù)庫管理想在JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序開發(fā)應(yīng)用程序,那該怎么辦呢?數(shù)據(jù)庫開發(fā)人員是否需要推翻原有的架構(gòu)進(jìn)行重新開發(fā)呢?答案是否定的,也是肯定的。這個(gè)答案或許有點(diǎn)前后矛盾的感覺。否定說的是數(shù)據(jù)庫管理員不用全部推翻原先的架構(gòu),而是可以原先的架構(gòu)跟新的架構(gòu)并存??隙ǖ氖菫榱撕罄m(xù)應(yīng)用程序性能與穩(wěn)定性的考慮,在合適的時(shí)候數(shù)據(jù)庫開發(fā)人員***能夠慢慢的對(duì)原先的開發(fā)架構(gòu)進(jìn)行調(diào)整。不過在這個(gè)調(diào)整的過程中,新舊兩個(gè)開發(fā)架構(gòu)是可以同時(shí)采用的。另外有些數(shù)據(jù)庫系統(tǒng)可能沒有提供以上三種類型的任何一種JDBC數(shù)據(jù)庫啟動(dòng)程序。如使用用戶比較多的ACCESS數(shù)據(jù)庫系統(tǒng)。如果JAVA程序開發(fā)人員需要在這個(gè)數(shù)據(jù)庫上開發(fā)應(yīng)用軟件的話,可能就需要用到這個(gè)橋接型的JDBC驅(qū)動(dòng)程序。這個(gè)類型的數(shù)據(jù)庫驅(qū)動(dòng)程序有如下幾個(gè)特點(diǎn)。
一是其保留了ODBC數(shù)據(jù)庫驅(qū)動(dòng)程序,把相關(guān)的SQL語句通過JDBC驅(qū)動(dòng)程序轉(zhuǎn)換為ODBC數(shù)據(jù)庫驅(qū)動(dòng)程序可以理解的語句。應(yīng)用這個(gè)數(shù)據(jù)類型的時(shí)候,數(shù)據(jù)庫管理員不用考慮數(shù)據(jù)庫底層的連接問題。同時(shí)如果應(yīng)用系統(tǒng)原先是在ODBC的架構(gòu)下開發(fā)的,還可以保留原先的架構(gòu)。
二是其維護(hù)比其他類型的驅(qū)動(dòng)程序都要麻煩與復(fù)雜。一方面由于這種類型的驅(qū)動(dòng)程序仍然需要用到ODBC,所以在客戶端上還需要部署有ODBC驅(qū)動(dòng)程序。另一方面,系統(tǒng)先調(diào)用JDBC驅(qū)動(dòng)程序;然后再通過JDBC驅(qū)動(dòng)程序調(diào)用ODBC數(shù)據(jù)庫驅(qū)動(dòng)程序;然后再連接到數(shù)據(jù)庫。中間經(jīng)過了多個(gè)環(huán)節(jié)。如何其中任何一個(gè)環(huán)節(jié)出現(xiàn)了問題,都可能導(dǎo)致數(shù)據(jù)庫連接的故障。萬一真的出現(xiàn)了問題的話,那么數(shù)據(jù)庫管理員查找問題就會(huì)變得復(fù)雜的多。
總之筆者建議數(shù)據(jù)庫管理員***采用***、二種數(shù)據(jù)庫驅(qū)動(dòng)程序;如果這兩種驅(qū)動(dòng)程序不支持的話,那么就采用第三種驅(qū)動(dòng)程序。對(duì)于***種驅(qū)動(dòng)程序數(shù)據(jù)庫管理員要慎用,除非數(shù)據(jù)庫管理員對(duì)自己的能力相當(dāng)?shù)淖孕?。大家在選擇JDBC數(shù)據(jù)庫驅(qū)動(dòng)程序時(shí)可以參考本文,然后根據(jù)自己的實(shí)際情況,選擇合適的驅(qū)動(dòng)程序。
【編輯推薦】