志當(dāng)存高遠(yuǎn),功到自然成!

          少年強則中國強,少年進步則中國進步!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks
          選擇合適的JDBC驅(qū)動程序
          文章來源:(仙人掌工作室 )
          閱讀次數(shù):(65)
          更新時間:(2002-10-17 19:14:00)

          如果你不了解JDBC驅(qū)動程序各個特性指標(biāo)的具體含義,或者不了解到底哪些特性才值得重視,要從大量的驅(qū)動程序中選擇最合適的一個并不容易。本文將助你一臂之力。

          概述

          說 到數(shù)據(jù)庫驅(qū)動程序,可以借用喜劇演員Rodney Dangerfield的一句話:“勿以等閑視之”。許多開發(fā)者認(rèn)為驅(qū)動程序只是一些功能確定且無足輕重的工具,但事實上,驅(qū)動程序往往不是數(shù)據(jù)轉(zhuǎn)換器或 數(shù)據(jù)管道那么簡單,它們的有些特性極其重要,既影響著應(yīng)用的性能,也影響著應(yīng)用的功能發(fā)揮。


          Java開發(fā)者常常需要訪問包括關(guān) 系數(shù)據(jù)庫在內(nèi)的各種各樣的數(shù)據(jù)源,JDBC驅(qū)動程序利用JDBC標(biāo)準(zhǔn)建立起了Java程序和數(shù)據(jù)源之間的橋梁。在JDBC出現(xiàn)之前,Java開發(fā)者為了構(gòu) 造帶有數(shù)據(jù)庫事務(wù)的應(yīng)用,不得不沉陷于各種復(fù)雜的SQL語句。為了解決這個問題,Sun和它的合作者開發(fā)出了簡化Java應(yīng)用訪問各種數(shù)據(jù)資源的JDBC API。


          一進入JDBC驅(qū)動程序的世界,你很快會有一種眼花繚亂的感覺:可供選擇的驅(qū)動程序?qū)嵲谔嗔耍‰m然擁有選擇的權(quán)利是 一件好事,但是,舉例來說,Sun網(wǎng)站上列出了160多個JDBC驅(qū)動程序,卻沒有詳細(xì)說明究竟哪一個驅(qū)動程序更好,好在哪里?雖然根據(jù)說明,每一個驅(qū)動 程序都支持某些重要的功能集,但還有一個問題有待回答:在一個具體的環(huán)境中,這些不同驅(qū)動程序支持的功能集到底有什么意義?這就是本文要討論的問題。


          我們來回顧一些JDBC標(biāo)準(zhǔn)和驅(qū)動程序的基礎(chǔ)知識。首先,JDBC提供了完成下列基本任務(wù)的方法:


          ● 以URL或注冊到JNDI名稱服務(wù)的DataSource對象為基礎(chǔ),創(chuàng)建和管理數(shù)據(jù)源連接。因此,客戶端不必進行復(fù)雜的配置。


          ● 構(gòu)造SQL命令,向數(shù)據(jù)源發(fā)送SQL命令。


          ● 提取和處理返回給Java應(yīng)用或Applet的結(jié)果集。


          JDBC 把Java數(shù)據(jù)庫調(diào)用轉(zhuǎn)換成訪問表格式數(shù)據(jù)源的SQL語句。這些數(shù)據(jù)源既包括企業(yè)級的SQL數(shù)據(jù)庫系統(tǒng),例如Oracle、SQL Server、IBM UDB、Informix、Sybase等等,也有電子表格和扁平文件的數(shù)據(jù)源,如CSV、TSV和大型機數(shù)據(jù)文件。有了JDBC,我們就可以用單一的命 令更新多個字段、在單個事務(wù)中處理多個數(shù)據(jù)源(表)。這意味著:


          ● 可以通過批量處理優(yōu)化數(shù)據(jù)訪問性能。


          ● JDBC提供了訪問不同數(shù)據(jù)庫產(chǎn)品的公共框架,不管這些數(shù)據(jù)庫系統(tǒng)本身是否具有互操作能力。


          ● 為數(shù)據(jù)源提供了一個抽象層,當(dāng)數(shù)據(jù)源類型發(fā)生變化時,修改數(shù)據(jù)源定義變得更加簡單。


          如果客戶程序要調(diào)用的軟件或中間層服務(wù)器要調(diào)用的中間件不屬于開發(fā)者控制范圍,JDBC提供了通過Internet訪問數(shù)據(jù)源的能力。JDBC充分發(fā)揮了Java可移植、自包含的特性,避免了僅僅由于平臺、環(huán)境的不同而為同一個應(yīng)用提供多個版本的必要。

          JDBC規(guī)范以及驅(qū)動程序分類

          現(xiàn)在我們來看看JDBC規(guī)范。JDBC規(guī)范歷史上經(jīng)歷了幾次重大的版本更新:

          ● JDBC 1.0:提供基本的功能,強調(diào)易用性。

          ● JDBC 2.0:提供更多高級功能以及服務(wù)器端的處理能力。


          ● JDBC 3.0:完善了API,優(yōu)化性能。改進了連接池、語句緩沖機制,提供了向Sun連接器體系的遷移途徑。


          一些在JDBC 2.0規(guī)范中可選的功能,例如分布式事務(wù),在JDBC 3.0規(guī)范中是必需的。同時,JDBC 3.0還定義了一些新的特性,例如在緩沖池中緩沖經(jīng)過預(yù)處理的命令等。


          最 初的Java語言規(guī)范并沒有規(guī)定Java程序如何訪問數(shù)據(jù)庫。但不久之后,Sun和它的合作者就開始填補這個空白。早期的Java數(shù)據(jù)訪問策略依賴于建立 通向ODBC(ODBC是Microsoft發(fā)起的數(shù)據(jù)源訪問標(biāo)準(zhǔn))的橋梁,結(jié)果就是JDBC-ODBC橋接驅(qū)動程序。今天,JDBC驅(qū)動程序總共有四種 類型:


          第一類:JDBC-ODBC橋,再加上ODBC驅(qū)動程序。


          第二類:本機API,部分是Java的驅(qū)動程序。


          第三類:面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序。


          第四類:直接面向數(shù)據(jù)庫的純Java驅(qū)動程序。


          第三、四兩類都是純Java的驅(qū)動程序,因此,對于Java開發(fā)者來說,它們在性能、可移植性、功能等方面都有優(yōu)勢。


          第一類


          第 一類JDBC驅(qū)動程序是JDBC-ODBC橋再加上一個ODBC驅(qū)動程序。Sun建議第一類驅(qū)動程序只用于原型開發(fā),而不要用于正式的運行環(huán)境。橋接驅(qū)動 程序由Sun提供,它的目標(biāo)是支持傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)。Sun為該軟件提供關(guān)鍵問題的補丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅(qū)動程序用于已經(jīng) 在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。


          盡管Sun提供了JDBC-ODBC橋接驅(qū)動程序,但由于ODBC會在客戶端裝載二進制代碼和數(shù)據(jù)庫客戶端代碼,這種技術(shù)不適用于高事務(wù)性的環(huán)境。另外,第一類JDBC驅(qū)動程序不支持完整的Java命令集,而是局限于ODBC驅(qū)動程序的功能。


          第二類


          第二類JDBC驅(qū)動程序是本機API的部分Java代碼的驅(qū)動程序,用于把JDBC調(diào)用轉(zhuǎn)換成主流數(shù)據(jù)庫API的本機調(diào)用。這類驅(qū)動程序也存在與第一類驅(qū)動程序一樣的性能問題,即客戶端載入二進制代碼的問題,而且它們被綁定了特定的平臺。

          第 二類驅(qū)動程序要求編寫面向特定平臺的代碼,這對于任何Java開發(fā)者來說恐怕都不屬于真正樂意做的事情。主流的數(shù)據(jù)庫廠商,例如Oracle和IBM,都 為它們的企業(yè)數(shù)據(jù)庫平臺提供了第二類驅(qū)動程序,使用這些驅(qū)動程序的開發(fā)者必須及時跟進不同數(shù)據(jù)庫廠商針對不同操作系統(tǒng)發(fā)行的各個驅(qū)動程序版本。


          另外,由于第二類驅(qū)動程序沒有使用純Java的API,把Java應(yīng)用連接到數(shù)據(jù)源時,往往必須執(zhí)行一些額外的配置工作。很多時候,第二類驅(qū)動程序不能在體系結(jié)構(gòu)上與大型主機的數(shù)據(jù)源兼容;即使做到了兼容,效果也是差強人意。


          由于諸如此類的原因,大多數(shù)Java數(shù)據(jù)庫開發(fā)者選擇第三類驅(qū)動程序,或者選擇更靈活的第四類純Java新式驅(qū)動程序。

          圖一:第1、2兩類驅(qū)動程序的體系比較

          第三類

          第 三類JDBC驅(qū)動程序是面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序,JDBC調(diào)用被轉(zhuǎn)換成一種中間件廠商的協(xié)議,中間件再把這些調(diào)用轉(zhuǎn)換到數(shù)據(jù)庫API。第三 類JDBC驅(qū)動程序的優(yōu)點是它以服務(wù)器為基礎(chǔ),也就是不再需要客戶端的本機代碼,這使第三類驅(qū)動程序要比第一、二兩類快。另外,開發(fā)者還可以利用單一的驅(qū) 動程序連接到多種數(shù)據(jù)庫。


          第四類


          第四類JDBC驅(qū)動程序是直接面向數(shù)據(jù)庫的純Java驅(qū)動程序,即所 謂的“瘦”(thin)驅(qū)動程序,它把JDBC調(diào)用轉(zhuǎn)換成某種直接可被DBMS使用的網(wǎng)絡(luò)協(xié)議,這樣,客戶機和應(yīng)用服務(wù)器可以直接調(diào)用DBMS服務(wù)器。對 于第四類驅(qū)動程序,不同DBMS的驅(qū)動程序不同。因此,在一個異構(gòu)計算環(huán)境中,驅(qū)動程序的數(shù)量可能會比較多。但是,由于第四類驅(qū)動程序具有較高的性能,能 夠直接訪問DBMS,所以這一問題就不那么突出了。

          圖二:第3、4兩類驅(qū)動程序的體系比較

          選擇JDBC驅(qū)動程序

          Sun 在http://industry.java.sun.com/products/jdbc/drivers維護著一個JDBC驅(qū)動程序的清單,如圖三所 示。這個頁面提供了一個驅(qū)動程序選擇工具,能夠根據(jù)指定的特征顯示出符合要求的驅(qū)動程序,允許指定的特征包括驅(qū)動程序類型、支持的JDBC版本、支持的數(shù) 據(jù)庫等等。今天(2002年09月),這個頁面收集的驅(qū)動程序已經(jīng)達到165個!


          許多人用這個選擇工具來確定自己要用的驅(qū)動程序。所以,有必要詳細(xì)介紹一下這個選擇工具:


          ● JDBC API Version:選擇JDBC版本,可從1.x、2.x或3.x中任選一種。


          ● Certified for J2EE:J2EE認(rèn)證,可選擇J2EE 1.3或J2EE 1.2(其中之一或全部)。


          ● Driver Type:驅(qū)動程序類型,1、2、3或4,任意一種或全部。


          ● Supported DBMS:支持的DBMS,有83個選項,大部分是各廠商的數(shù)據(jù)庫產(chǎn)品,但也有一部分是產(chǎn)業(yè)標(biāo)準(zhǔn),例如JDBC、LDAP、ODBC、OLE DB Provider、Text(TSV)、SQL/DS,以及XML。可選擇一個或多個。


          ● Required Features:必需的特性,包括DataSource、連接池(Conn. Pooling)、分布式事務(wù)(Dist. Trans.)、記錄集(RowSets),可任選一個或者多個。


          ● Returns per page:每頁返回的結(jié)果數(shù)量。

          圖三:Sun的JDBC驅(qū)動程序選擇工具

          下面我們來看看各個選項分別有哪些意義。

          JDBC API

          JDBC API的重要性在于,它決定了Java開發(fā)者可用的功能。早期的Java應(yīng)用可能無法使用JDBC 3.0提供的許多高級特性,但這些特性對于高事務(wù)性、分布式的應(yīng)用來說必不可少。使用最新版本的JDBC API,開發(fā)者才能使用各種新的DBMS和操作系統(tǒng)安全擴展,以及諸如連接池、語句緩沖池、RowSets對象等最新的性能優(yōu)化機制。


          J2EE認(rèn)證


          記 住,JDBC只是一個規(guī)范,而不是一個軟件的標(biāo)準(zhǔn)實現(xiàn)。各個廠商可以根據(jù)需要實現(xiàn)自己的JDBC驅(qū)動程序。有一些驅(qū)動程序完全遵從J2EE規(guī)范,還有許多 驅(qū)動程序不遵從J2EE規(guī)范。JDBC驅(qū)動程序的J2EE認(rèn)證(即獲取Certified for J2EE logo)由Sun的CTS(Certification Test Suite)確定,如果要判斷一種驅(qū)動程序是否比另一種優(yōu)秀,它可以作為判斷驅(qū)動程序質(zhì)量的標(biāo)準(zhǔn)之一。一般我們可以認(rèn)為,通過這種認(rèn)證的廠商對產(chǎn)品質(zhì)量比 較關(guān)注,在http://java.sun.com/products/jdbc/industry.html可以找到一個擁有相關(guān)產(chǎn)品且認(rèn)可 (Endorse)JDBC標(biāo)準(zhǔn)的廠商清單。


          必需的特性


          圖三Required Features部分提供了幾個JDBC驅(qū)動程序的特性選項,這些特性在JDBC 2.0規(guī)范中開始引入,但在JDBC 3.0中是必需的。

          DataSource 是一個由JDBC驅(qū)動程序管理的包含數(shù)據(jù)庫連接信息的對象。DataSource與JNDI服務(wù)協(xié)作,數(shù)據(jù)庫連接的實例化和管理工作都獨立于使用它的應(yīng)用 之外。與連接有關(guān)的信息,例如路徑和端口號,可以在DataSource對象的屬性中方便地修改,無需改動使用該數(shù)據(jù)源的應(yīng)用代碼。當(dāng)前,Sun收集的總 共165個驅(qū)動程序中有62個支持該特性。


          JDBC支持連接池。所謂連接池,就是讓一些數(shù)據(jù)庫連接對象在緩沖池中保持打開狀 態(tài),使得任何請求使用數(shù)據(jù)庫連接的應(yīng)用都能夠立即獲得數(shù)據(jù)庫連接,不再需要昂貴的網(wǎng)絡(luò)開銷聯(lián)系數(shù)據(jù)庫服務(wù)器取得連接,連接池會從本地緩沖池中取得空閑的連 接賦予發(fā)出請求的Java應(yīng)用。當(dāng)應(yīng)用終止數(shù)據(jù)庫連接,數(shù)據(jù)庫連接實際上并未被拆除,而是返回給連接池緩沖區(qū)供其他應(yīng)用重用,從而有效地提升數(shù)據(jù)庫訪問性 能。


          在數(shù)據(jù)庫事務(wù)中,建立連接是資源開銷最大的操作。當(dāng)一個應(yīng)用試圖建立數(shù)據(jù)庫連接時,需要多次網(wǎng)絡(luò)交互過程才能完成(例如, 對于Oracle數(shù)據(jù)庫連接,這個數(shù)字是9)。然而,一旦成功建立了連接,把這個連接保留下來再在以后的操作中重用,開銷就要小得多。數(shù)據(jù)庫連接池特性大 大提高了改進數(shù)據(jù)傳輸性能和可伸縮性的潛力,對于應(yīng)用服務(wù)器來說尤其如此。Sun收集的JDBC驅(qū)動程序中有62個支持連接池。


          在分布式系統(tǒng)中,應(yīng)用常常需要用多個事務(wù)提取數(shù)據(jù),且數(shù)據(jù)往往來自多個數(shù)據(jù)源。要求有獨立的事務(wù)協(xié)調(diào)系統(tǒng)進行協(xié)調(diào)的事務(wù)稱為分布式事務(wù)。對于Java數(shù)據(jù)庫開發(fā)者來說,除了JDBC驅(qū)動程序的性能指標(biāo)之外,分布式事務(wù)支持也許是最重要的特性了。


          分 布式事務(wù)要求有額外的資源提供可靠的支持,這主要是由于從不同數(shù)據(jù)源提取數(shù)據(jù)的延遲不同,同時也由于存在著互操作的問題。例如,要區(qū)分一個失敗的事務(wù)和一 個響應(yīng)緩慢的事務(wù)并不容易,這就要求DTS中的資源管理器以適當(dāng)?shù)姆绞阶圆f(xié)調(diào)ROLLBACK或COMMIT操作,同時應(yīng)當(dāng)盡量地減少編程工作量。


          一般地,分布式事務(wù)利用事務(wù)管理器(Transaction Manager)進行不同資源管理器的協(xié)調(diào)工作。有了DTP(Distributed Transaction Processing)體系中的事務(wù)管理器提供應(yīng)用與資源的仲裁,就有可能為應(yīng)用提供跨越多個數(shù)據(jù)資源的ACID事務(wù)。


          在需要多個步驟才能得出所需結(jié)果的場合,需要有一種軟件模塊,通常是事務(wù)管理器,協(xié)調(diào)各個處理過程,例如iPlanet Trustbase Transaction Manager就是這樣一個產(chǎn)品。當(dāng)前Sun收集的JDBC驅(qū)動程序中有45個支持此特性。


          RowSets (記錄集)對象是查詢的結(jié)果集,包含從表格式數(shù)據(jù)源獲取的記錄。RowSets擁有類似于JavaBean的屬性和事件提醒機制,同時它本身也是一個 JavaBean組件,可以在開發(fā)環(huán)境中用編程的方式創(chuàng)建和使用。RowSets有連接的(Connected)和非連接的(Disconnected, 或稱之為離線式的)兩種類型。非連接的記錄集在提取數(shù)據(jù)時需要連接到數(shù)據(jù)源,但處于非連接狀態(tài)時就不再需要JDBC驅(qū)動程序。這種記錄集體積小,常用來把 數(shù)據(jù)發(fā)送給瘦客戶端。非連接的記錄集保存在內(nèi)存中,同時保存的還有其原數(shù)據(jù)(Metadata)和連接以及執(zhí)行指令。與此相對,連接的記錄集在被使用時總 是保持一個打開的連接。當(dāng)前Sun收集的驅(qū)動程序共有31個支持記錄集特性,這個數(shù)字相對較小,也許是由于該特性不是經(jīng)常要用到。


          必須指出的是,Sun的JDBC網(wǎng)站把“支持”RowSets定義成JDBC驅(qū)動程序本身正式打包和帶有RowSets,所以,這個網(wǎng)站上列出的一些驅(qū)動程序可能沒有支持RowSets的標(biāo)記,但它們實際上卻支持多種RowSets。


          JDBC 3.0規(guī)范定義了prepared statement pooling(把已準(zhǔn)備好的SQL語句放入緩沖池),當(dāng)前未被Sun加入到圖三的JDBC驅(qū)動程序搜索工具,但可以確信它不久就會被作為一個可搜索的特 性加入。從本質(zhì)上看,語句緩沖是把已經(jīng)優(yōu)化且已經(jīng)運行過的SQL語句保存到緩沖池,一旦需要再次執(zhí)行,可以不必再進行優(yōu)化之類的預(yù)處理過程。SQL語句池 能夠顯著地提升性能,對于任何JDBC驅(qū)動程序來說,它都是一個值得關(guān)注的亮點。


          對于需要多次執(zhí)行的SQL語句,緩沖已準(zhǔn)備好 的語句特別有用。舉例來說,如果一個查詢的功能是提取特定產(chǎn)品類別的當(dāng)前庫存值,每天都要頻繁地運行多次,那么它就可以從語句緩沖獲益。再次執(zhí)行已緩沖的 SQL語句時,只需向查詢傳入?yún)?shù);所有的預(yù)處理步驟,例如語法檢查、目標(biāo)合法性檢查、優(yōu)化訪問路徑、優(yōu)化執(zhí)行計劃等,都已經(jīng)緩沖在內(nèi)存中。


          對于開發(fā)者來說,語句緩沖池還有一個特別的優(yōu)點,即它無需開發(fā)者編寫任何代碼(就如連接池一樣)。只要你采用了帶有語句池機制的驅(qū)動程序,你就得到了語句緩沖帶來的性能優(yōu)勢。


          只要JDBC驅(qū)動程序支持,語句池和連接池可以在一個應(yīng)用中同時起作用。當(dāng)程序用到來自連接池的連接,所有以前曾經(jīng)運行過SQL語句的連接會擁有已經(jīng)定義好的語句池。因此,即使應(yīng)用第一次利用某個連接準(zhǔn)備執(zhí)行SQL語句,也可能不需要SQL語句執(zhí)行前的準(zhǔn)備過程。

          結(jié)束語

          JDBC驅(qū)動程序會對應(yīng)用的表現(xiàn)產(chǎn)生許多重大的影響。對于系統(tǒng)的整體性能來說,JDBC驅(qū)動程序的特性實際上是一個關(guān)鍵性因素。不僅在企業(yè)級數(shù)據(jù)庫應(yīng)用中是這樣,對于要訪問分布式數(shù)據(jù)資源的應(yīng)用,這個問題就更加突出。


          從 長遠(yuǎn)的眼光來看,當(dāng)你選擇驅(qū)動程序時,請把JDBC 3.0定義的特性,包括DataSource對象、連接池、分布式事務(wù)支持、RowSets、語句緩沖池等,作為選擇標(biāo)準(zhǔn)之一。只要有可能,就要選擇那些 直接操作數(shù)據(jù)庫API的驅(qū)動程序,而不要選擇那些經(jīng)過一層轉(zhuǎn)換后才與數(shù)據(jù)庫API交互的驅(qū)動程序,因為前者往往具有較好的性能表現(xiàn)。


          如 果性能和對Java標(biāo)準(zhǔn)的遵從性都是必不可少的考慮因素,驅(qū)動程序非三、四兩類莫屬。找出那些支持最新版本規(guī)范、提供最豐富功能的JDBC驅(qū)動程序,絕對 是一件值得做的事情。另外還有一個需要考慮的因素是,個別JDBC驅(qū)動程序提供了一些通常不會隨著DBMS本機驅(qū)動程序提供的附加工具,這些工具可能會對 你的開發(fā)工作產(chǎn)生重要影響。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 达拉特旗| 乾安县| 鞍山市| 乐东| 林甸县| 武强县| 大厂| 大姚县| 巩义市| 黄大仙区| 珠海市| 香河县| 福鼎市| 托里县| 永定县| 金堂县| 当雄县| 榆林市| 石嘴山市| 故城县| 濮阳县| 大关县| 珠海市| 通山县| 济阳县| 双城市| 乌什县| 平武县| 甘孜县| 徐闻县| 桑植县| 婺源县| 图们市| 乐东| 全南县| 英超| 富宁县| 门头沟区| 聊城市| 沁源县| 亳州市|