文章來源:(仙人掌工作室 )
閱讀次數:(65)
更新時間:(2002-10-17 19:14:00)
如果你不了解JDBC驅動程序各個特性指標的具體含義,或者不了解到底哪些特性才值得重視,要從大量的驅動程序中選擇最合適的一個并不容易。本文將助你一臂之力。
概述
說 到數據庫驅動程序,可以借用喜劇演員Rodney Dangerfield的一句話:“勿以等閑視之”。許多開發者認為驅動程序只是一些功能確定且無足輕重的工具,但事實上,驅動程序往往不是數據轉換器或 數據管道那么簡單,它們的有些特性極其重要,既影響著應用的性能,也影響著應用的功能發揮。
Java開發者常常需要訪問包括關
系數據庫在內的各種各樣的數據源,JDBC驅動程序利用JDBC標準建立起了Java程序和數據源之間的橋梁。在JDBC出現之前,Java開發者為了構
造帶有數據庫事務的應用,不得不沉陷于各種復雜的SQL語句。為了解決這個問題,Sun和它的合作者開發出了簡化Java應用訪問各種數據資源的JDBC
API。
一進入JDBC驅動程序的世界,你很快會有一種眼花繚亂的感覺:可供選擇的驅動程序實在太多了!雖然擁有選擇的權利是
一件好事,但是,舉例來說,Sun網站上列出了160多個JDBC驅動程序,卻沒有詳細說明究竟哪一個驅動程序更好,好在哪里?雖然根據說明,每一個驅動
程序都支持某些重要的功能集,但還有一個問題有待回答:在一個具體的環境中,這些不同驅動程序支持的功能集到底有什么意義?這就是本文要討論的問題。
我們來回顧一些JDBC標準和驅動程序的基礎知識。首先,JDBC提供了完成下列基本任務的方法:
● 以URL或注冊到JNDI名稱服務的DataSource對象為基礎,創建和管理數據源連接。因此,客戶端不必進行復雜的配置。
● 構造SQL命令,向數據源發送SQL命令。
● 提取和處理返回給Java應用或Applet的結果集。
JDBC
把Java數據庫調用轉換成訪問表格式數據源的SQL語句。這些數據源既包括企業級的SQL數據庫系統,例如Oracle、SQL
Server、IBM
UDB、Informix、Sybase等等,也有電子表格和扁平文件的數據源,如CSV、TSV和大型機數據文件。有了JDBC,我們就可以用單一的命
令更新多個字段、在單個事務中處理多個數據源(表)。這意味著:
● 可以通過批量處理優化數據訪問性能。
● JDBC提供了訪問不同數據庫產品的公共框架,不管這些數據庫系統本身是否具有互操作能力。
● 為數據源提供了一個抽象層,當數據源類型發生變化時,修改數據源定義變得更加簡單。
如果客戶程序要調用的軟件或中間層服務器要調用的中間件不屬于開發者控制范圍,JDBC提供了通過Internet訪問數據源的能力。JDBC充分發揮了Java可移植、自包含的特性,避免了僅僅由于平臺、環境的不同而為同一個應用提供多個版本的必要。
JDBC規范以及驅動程序分類
現在我們來看看JDBC規范。JDBC規范歷史上經歷了幾次重大的版本更新:
● JDBC 1.0:提供基本的功能,強調易用性。
● JDBC 2.0:提供更多高級功能以及服務器端的處理能力。
● JDBC 3.0:完善了API,優化性能。改進了連接池、語句緩沖機制,提供了向Sun連接器體系的遷移途徑。
一些在JDBC 2.0規范中可選的功能,例如分布式事務,在JDBC 3.0規范中是必需的。同時,JDBC 3.0還定義了一些新的特性,例如在緩沖池中緩沖經過預處理的命令等。
最
初的Java語言規范并沒有規定Java程序如何訪問數據庫。但不久之后,Sun和它的合作者就開始填補這個空白。早期的Java數據訪問策略依賴于建立
通向ODBC(ODBC是Microsoft發起的數據源訪問標準)的橋梁,結果就是JDBC-ODBC橋接驅動程序。今天,JDBC驅動程序總共有四種
類型:
第一類:JDBC-ODBC橋,再加上ODBC驅動程序。
第二類:本機API,部分是Java的驅動程序。
第三類:面向數據庫中間件的純Java驅動程序。
第四類:直接面向數據庫的純Java驅動程序。
第三、四兩類都是純Java的驅動程序,因此,對于Java開發者來說,它們在性能、可移植性、功能等方面都有優勢。
第一類
第
一類JDBC驅動程序是JDBC-ODBC橋再加上一個ODBC驅動程序。Sun建議第一類驅動程序只用于原型開發,而不要用于正式的運行環境。橋接驅動
程序由Sun提供,它的目標是支持傳統的數據庫系統。Sun為該軟件提供關鍵問題的補丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅動程序用于已經
在ODBC技術上投資的情形,例如已經投資了Windows應用服務器。
盡管Sun提供了JDBC-ODBC橋接驅動程序,但由于ODBC會在客戶端裝載二進制代碼和數據庫客戶端代碼,這種技術不適用于高事務性的環境。另外,第一類JDBC驅動程序不支持完整的Java命令集,而是局限于ODBC驅動程序的功能。
第二類
第二類JDBC驅動程序是本機API的部分Java代碼的驅動程序,用于把JDBC調用轉換成主流數據庫API的本機調用。這類驅動程序也存在與第一類驅動程序一樣的性能問題,即客戶端載入二進制代碼的問題,而且它們被綁定了特定的平臺。
第 二類驅動程序要求編寫面向特定平臺的代碼,這對于任何Java開發者來說恐怕都不屬于真正樂意做的事情。主流的數據庫廠商,例如Oracle和IBM,都 為它們的企業數據庫平臺提供了第二類驅動程序,使用這些驅動程序的開發者必須及時跟進不同數據庫廠商針對不同操作系統發行的各個驅動程序版本。
另外,由于第二類驅動程序沒有使用純Java的API,把Java應用連接到數據源時,往往必須執行一些額外的配置工作。很多時候,第二類驅動程序不能在體系結構上與大型主機的數據源兼容;即使做到了兼容,效果也是差強人意。
由于諸如此類的原因,大多數Java數據庫開發者選擇第三類驅動程序,或者選擇更靈活的第四類純Java新式驅動程序。
圖一:第1、2兩類驅動程序的體系比較
第三類
第 三類JDBC驅動程序是面向數據庫中間件的純Java驅動程序,JDBC調用被轉換成一種中間件廠商的協議,中間件再把這些調用轉換到數據庫API。第三 類JDBC驅動程序的優點是它以服務器為基礎,也就是不再需要客戶端的本機代碼,這使第三類驅動程序要比第一、二兩類快。另外,開發者還可以利用單一的驅 動程序連接到多種數據庫。
第四類
第四類JDBC驅動程序是直接面向數據庫的純Java驅動程序,即所
謂的“瘦”(thin)驅動程序,它把JDBC調用轉換成某種直接可被DBMS使用的網絡協議,這樣,客戶機和應用服務器可以直接調用DBMS服務器。對
于第四類驅動程序,不同DBMS的驅動程序不同。因此,在一個異構計算環境中,驅動程序的數量可能會比較多。但是,由于第四類驅動程序具有較高的性能,能
夠直接訪問DBMS,所以這一問題就不那么突出了。
圖二:第3、4兩類驅動程序的體系比較
選擇JDBC驅動程序
Sun 在http://industry.java.sun.com/products/jdbc/drivers維護著一個JDBC驅動程序的清單,如圖三所 示。這個頁面提供了一個驅動程序選擇工具,能夠根據指定的特征顯示出符合要求的驅動程序,允許指定的特征包括驅動程序類型、支持的JDBC版本、支持的數 據庫等等。今天(2002年09月),這個頁面收集的驅動程序已經達到165個!
許多人用這個選擇工具來確定自己要用的驅動程序。所以,有必要詳細介紹一下這個選擇工具:
● JDBC API Version:選擇JDBC版本,可從1.x、2.x或3.x中任選一種。
● Certified for J2EE:J2EE認證,可選擇J2EE 1.3或J2EE 1.2(其中之一或全部)。
● Driver Type:驅動程序類型,1、2、3或4,任意一種或全部。
● Supported DBMS:支持的DBMS,有83個選項,大部分是各廠商的數據庫產品,但也有一部分是產業標準,例如JDBC、LDAP、ODBC、OLE DB Provider、Text(TSV)、SQL/DS,以及XML。可選擇一個或多個。
● Required Features:必需的特性,包括DataSource、連接池(Conn. Pooling)、分布式事務(Dist. Trans.)、記錄集(RowSets),可任選一個或者多個。
● Returns per page:每頁返回的結果數量。
圖三:Sun的JDBC驅動程序選擇工具
下面我們來看看各個選項分別有哪些意義。
JDBC API
JDBC API的重要性在于,它決定了Java開發者可用的功能。早期的Java應用可能無法使用JDBC 3.0提供的許多高級特性,但這些特性對于高事務性、分布式的應用來說必不可少。使用最新版本的JDBC API,開發者才能使用各種新的DBMS和操作系統安全擴展,以及諸如連接池、語句緩沖池、RowSets對象等最新的性能優化機制。
J2EE認證
記
住,JDBC只是一個規范,而不是一個軟件的標準實現。各個廠商可以根據需要實現自己的JDBC驅動程序。有一些驅動程序完全遵從J2EE規范,還有許多
驅動程序不遵從J2EE規范。JDBC驅動程序的J2EE認證(即獲取Certified for J2EE
logo)由Sun的CTS(Certification Test
Suite)確定,如果要判斷一種驅動程序是否比另一種優秀,它可以作為判斷驅動程序質量的標準之一。一般我們可以認為,通過這種認證的廠商對產品質量比
較關注,在http://java.sun.com/products/jdbc/industry.html可以找到一個擁有相關產品且認可
(Endorse)JDBC標準的廠商清單。
必需的特性
圖三Required Features部分提供了幾個JDBC驅動程序的特性選項,這些特性在JDBC 2.0規范中開始引入,但在JDBC 3.0中是必需的。
DataSource 是一個由JDBC驅動程序管理的包含數據庫連接信息的對象。DataSource與JNDI服務協作,數據庫連接的實例化和管理工作都獨立于使用它的應用 之外。與連接有關的信息,例如路徑和端口號,可以在DataSource對象的屬性中方便地修改,無需改動使用該數據源的應用代碼。當前,Sun收集的總 共165個驅動程序中有62個支持該特性。
JDBC支持連接池。所謂連接池,就是讓一些數據庫連接對象在緩沖池中保持打開狀
態,使得任何請求使用數據庫連接的應用都能夠立即獲得數據庫連接,不再需要昂貴的網絡開銷聯系數據庫服務器取得連接,連接池會從本地緩沖池中取得空閑的連
接賦予發出請求的Java應用。當應用終止數據庫連接,數據庫連接實際上并未被拆除,而是返回給連接池緩沖區供其他應用重用,從而有效地提升數據庫訪問性
能。
在數據庫事務中,建立連接是資源開銷最大的操作。當一個應用試圖建立數據庫連接時,需要多次網絡交互過程才能完成(例如,
對于Oracle數據庫連接,這個數字是9)。然而,一旦成功建立了連接,把這個連接保留下來再在以后的操作中重用,開銷就要小得多。數據庫連接池特性大
大提高了改進數據傳輸性能和可伸縮性的潛力,對于應用服務器來說尤其如此。Sun收集的JDBC驅動程序中有62個支持連接池。
在分布式系統中,應用常常需要用多個事務提取數據,且數據往往來自多個數據源。要求有獨立的事務協調系統進行協調的事務稱為分布式事務。對于Java數據庫開發者來說,除了JDBC驅動程序的性能指標之外,分布式事務支持也許是最重要的特性了。
分
布式事務要求有額外的資源提供可靠的支持,這主要是由于從不同數據源提取數據的延遲不同,同時也由于存在著互操作的問題。例如,要區分一個失敗的事務和一
個響應緩慢的事務并不容易,這就要求DTS中的資源管理器以適當的方式注冊并協調ROLLBACK或COMMIT操作,同時應當盡量地減少編程工作量。
一般地,分布式事務利用事務管理器(Transaction
Manager)進行不同資源管理器的協調工作。有了DTP(Distributed Transaction
Processing)體系中的事務管理器提供應用與資源的仲裁,就有可能為應用提供跨越多個數據資源的ACID事務。
在需要多個步驟才能得出所需結果的場合,需要有一種軟件模塊,通常是事務管理器,協調各個處理過程,例如iPlanet Trustbase Transaction Manager就是這樣一個產品。當前Sun收集的JDBC驅動程序中有45個支持此特性。
RowSets
(記錄集)對象是查詢的結果集,包含從表格式數據源獲取的記錄。RowSets擁有類似于JavaBean的屬性和事件提醒機制,同時它本身也是一個
JavaBean組件,可以在開發環境中用編程的方式創建和使用。RowSets有連接的(Connected)和非連接的(Disconnected,
或稱之為離線式的)兩種類型。非連接的記錄集在提取數據時需要連接到數據源,但處于非連接狀態時就不再需要JDBC驅動程序。這種記錄集體積小,常用來把
數據發送給瘦客戶端。非連接的記錄集保存在內存中,同時保存的還有其原數據(Metadata)和連接以及執行指令。與此相對,連接的記錄集在被使用時總
是保持一個打開的連接。當前Sun收集的驅動程序共有31個支持記錄集特性,這個數字相對較小,也許是由于該特性不是經常要用到。
必須指出的是,Sun的JDBC網站把“支持”RowSets定義成JDBC驅動程序本身正式打包和帶有RowSets,所以,這個網站上列出的一些驅動程序可能沒有支持RowSets的標記,但它們實際上卻支持多種RowSets。
JDBC
3.0規范定義了prepared statement
pooling(把已準備好的SQL語句放入緩沖池),當前未被Sun加入到圖三的JDBC驅動程序搜索工具,但可以確信它不久就會被作為一個可搜索的特
性加入。從本質上看,語句緩沖是把已經優化且已經運行過的SQL語句保存到緩沖池,一旦需要再次執行,可以不必再進行優化之類的預處理過程。SQL語句池
能夠顯著地提升性能,對于任何JDBC驅動程序來說,它都是一個值得關注的亮點。
對于需要多次執行的SQL語句,緩沖已準備好
的語句特別有用。舉例來說,如果一個查詢的功能是提取特定產品類別的當前庫存值,每天都要頻繁地運行多次,那么它就可以從語句緩沖獲益。再次執行已緩沖的
SQL語句時,只需向查詢傳入參數;所有的預處理步驟,例如語法檢查、目標合法性檢查、優化訪問路徑、優化執行計劃等,都已經緩沖在內存中。
對于開發者來說,語句緩沖池還有一個特別的優點,即它無需開發者編寫任何代碼(就如連接池一樣)。只要你采用了帶有語句池機制的驅動程序,你就得到了語句緩沖帶來的性能優勢。
只要JDBC驅動程序支持,語句池和連接池可以在一個應用中同時起作用。當程序用到來自連接池的連接,所有以前曾經運行過SQL語句的連接會擁有已經定義好的語句池。因此,即使應用第一次利用某個連接準備執行SQL語句,也可能不需要SQL語句執行前的準備過程。
結束語
JDBC驅動程序會對應用的表現產生許多重大的影響。對于系統的整體性能來說,JDBC驅動程序的特性實際上是一個關鍵性因素。不僅在企業級數據庫應用中是這樣,對于要訪問分布式數據資源的應用,這個問題就更加突出。
從
長遠的眼光來看,當你選擇驅動程序時,請把JDBC
3.0定義的特性,包括DataSource對象、連接池、分布式事務支持、RowSets、語句緩沖池等,作為選擇標準之一。只要有可能,就要選擇那些
直接操作數據庫API的驅動程序,而不要選擇那些經過一層轉換后才與數據庫API交互的驅動程序,因為前者往往具有較好的性能表現。
如
果性能和對Java標準的遵從性都是必不可少的考慮因素,驅動程序非三、四兩類莫屬。找出那些支持最新版本規范、提供最豐富功能的JDBC驅動程序,絕對
是一件值得做的事情。另外還有一個需要考慮的因素是,個別JDBC驅動程序提供了一些通常不會隨著DBMS本機驅動程序提供的附加工具,這些工具可能會對
你的開發工作產生重要影響。