连接访问数据库的技术方法
幾種數據庫連接方式優缺點比較
|
訪問接口 |
易用性 |
運行能力 |
可擴展性 |
技術層次 |
突出特點 |
|
ODBC |
差 |
較高 |
差 |
底層 |
可進行底層控制 |
|
MFC ODBC |
好 |
一般 |
高層 |
同用標準,應用廣泛 |
|
|
MFC DAO |
好 |
較高 |
一般 |
高層 |
訪問JET性能最好 |
|
OLE DB |
很難 |
高 |
好 |
底層 |
可訪問非關系型數據庫 |
|
ADO |
最好 |
高 |
好 |
高層 |
可訪問非關系型數據庫,有多種編程接口 |
ODBC是一種底層的訪問技術,因此,ODBC API可以是客戶應用程序能從底層設置和控制數據庫,完成一些高級數據庫技術無法完成的功能;但不足之處由于ODBC只能用于關系型數據庫,使得利用ODBC很難訪問對象數據庫及其他非關系數據庫。
DAO提供了一種通過程序代碼創建和操縱數據庫的機制。最大特點是對MICROSOFT JET數據庫的操作很方便,而且是操作JET數據庫時性能最好的技術接口之一。并且它并不只能用于訪問這種數據庫,事實上,通過DAO技術可以訪問從文本文件到大型后臺數據庫等多種數據格式。
ADO是基于OLE DB的訪問接口,它是面向對象的OLE DB技術,繼承了OLE DB的優點。屬于數據庫訪問的高層接口。
在速度上ADO〉DAO〉ODBC,綜合評定ADO,ODBC,DAO
ODBC是Microsoft的基于關系數據庫一種互連技術,它只能訪問關系數據庫,如果使用SQLAPI進行編程,效率較好,但代碼較多,如果使用MFC ODBC封裝的類進行訪問比較簡單。
ADO是一種基于COM的數據庫訪問技術,可以訪問關系數據庫與非關系數據庫,由于它是基于COM的,訪問速度也較快,占用資源較小。
DAO是Microsoft一種用來訪問Jet引擎的方法,主要用來訪問Access數據庫,使用起來比較簡單。
1.3.1 數據庫的連接方式
1. ODBC數據庫接口
ODBC即開放式數據庫互連(Open Database Connectivity),是微軟公司推出的一種實現應用程序和關系數據庫之間通訊的接口標準。符合標準的數據庫就可以通過SQL語言編寫的命令對數據 庫進行操作,但只針對關系數據庫。目前所有的關系數據庫都符合該標準(如SQL Server,Oracle,Access,Excel等)。ODBC本質上是一組數據庫訪問API(應用程序編程接口),由一組函數調用組成,核心是SQL語句,其結構如圖1.8所示:
圖 1.8 ODBC數據庫接口
2. OLE DB數據庫接口
OLE DB即數據庫鏈接和嵌入對象(Object Linking and Embedding DataBase)。OLE DB是微軟提出的基于COM思想且面向對象的一種技術標準,目的是提供一種統一的數據訪問接口訪問各種數據源,這里所說的“數據”除了標準的關系型數據庫 中的數據之外,還包括郵件數據、Web上的文本或圖形、目錄服務(DirectoryServices)、以及主機系統中的文件和地理數據以及自定義業務 對象等。OLE DB標準的核心內容就是提供一種相同的訪問接口,使得數據的使用者(應用程序)可以使用同樣的方法訪問各種數據,而不用考慮數據的具體存儲地點、格式或類型,其結構圖如圖1.9所示:
圖1.9 OLE DB數據庫接口
3. ADO數據庫接口
ADO(ActiveX Data Objects)是微軟公司開發的基于COM的數據庫應用程序接口,通過ADO連接數據庫,可以靈活地操作數據庫中的數據。
圖1.10展示了應用程序通過ADO訪問SQL Server數據庫接口。從圖中可看出,使用ADO訪問SQL Server數據庫有兩種途徑:一種是通過ODBC驅動程序,另一種是通過SQL Server專用的OLE DBProvider,后者有更高的訪問效率。
圖1.10 ADO訪問SQLServer的接口
4. ADO.NET數據庫接口
ASP.Net 使用 ADO.NET 數據模型。該模型從ADO 發展而來,但它不只是對 ADO的改進,而是采用了一種全新的技術。主要表現在以下幾個方面:
● ADO.NET 不是采用ActiveX 技術,而是與.NET框架緊密結合的產物。
● ADO.NET 包含對 XML標準的完全支持,這對于跨平臺交換數據具有重要的意義。
● ADO.NET 既能在與數據源連接的環境下工作,又能在斷開與數據源連接的條件下工作。特別是后者,非常適合于網絡應用的需要。因為在網絡環境下,保持與數據源連接,不符合網站的要求,不僅效率低,付出的代價高,而且常常會引發由于多個用戶同時訪問時帶來的沖突。因此 ADO.NET 系統集中主要精力用于解決在斷開與數據源連接的條件下數據處理的問題。
ADO.NET 提供了面向對象的數據庫視圖,并且在 ADO.NET 對象中封裝了許多數據庫屬性和關系。最重要的是,ADO.NET 通過很多方式封裝和隱藏了很多數據庫訪問的細節。可以完全不知道對象在與 ADO.NET 對象交互,也不用擔心數據移動到另外一個數據庫或者從另一個數據庫獲得數據的細節問題。如圖1.11顯示了 ADO.NET架構總覽。
圖1.11 通過ADO.NET訪問數據庫的接口模型
5. JDBC數據庫接口
JDBC(Java Data Base Connectivity)是Java Soft公司開發的,一組Java語言編寫的用于數據庫連接和操作的類和接口,可為多種關系數據庫提供統一的訪問方式。通過JDBC完成對數據庫的訪問包括四個主要組件:Java應用程序、JDBC驅動器管理器、驅動器和數據源。
在JDBC?API中有兩層接口:應用程序層和驅動程序層,前者使開發人員可以通過SQL調用數據庫和取得結果,后者處理與具體數據庫驅動程序的所有通訊。
使用JDBC接口對數據庫操作有如下優點:
(1).JDBC?API與ODBC十分相似,有利于用戶理解;
(2)使編程人員從復雜的驅動器調用命令和函數中解脫出來,而致力于應用程序功能的實現;
(3)JDBC支持不同的關系數據庫,增強了程序的可移植性。
使用JDBC的主要缺點:訪問數據記錄的速度會受到一定影響,此外,由于JDBC結構中包含了不同廠家的產品,這給數據源的更改帶來了較大麻煩。
4. 數據庫連接池技術
對于網絡環境下的數據庫應用,由于用戶眾多,使用傳統的JDBC方式進行數據庫連接,系統資源開銷過大成為制約大型企業級應用效率的瓶頸,采用數據庫連接池技術對數據庫連接進行管理,可以大大提高系統的效率和穩定性。
1.3.2 客戶/服務器(C/S)模式應用系統
Microsoft公司開發的SQL Server數據庫管理系統當前最流行的版本仍然是SQL Server2000,本書介紹SQL Server2000。
數據庫管理系統通過命令和適合專業人員的界面操作數據庫。對于SQL Server2000數據庫管理系統,用戶在SQL Server 2000的查詢分析器中輸入SQL命令,系統執行的結果返回到查詢分析器上顯示。用戶可以直接通過SQL Server 2000的企業管理器的界面操作數據庫。
圖1.12 數據庫應用程序與數據庫、數據庫管理系統之間的關系
1.3.3 三層客戶/服務器(B/S)模式應用系統
基于Web的數據庫應用采用三層客戶/服務器模式,也稱B/S結構。第一層為瀏覽器,第二層為Web服務器,第三層為數據庫服務器。
瀏覽器是用戶輸入數據和顯示結果的交互界面,用戶在瀏覽器表單中輸入數據,然后將表單中的數據提交并發送到Web服務器,Web服務器應用程序接受并處理
用戶的數據,通過數據庫服務器,從數據庫中查詢需要的數據(或把數據錄入數據庫)送Web服務器,Web服務器把返回的結果插入HTML頁面,傳送到客戶
端,在瀏覽器中顯示出來。如圖1.13所示。
Java連接數據庫的方式有多種:根據所需要的不同數據庫驅動分,分為四種:
1:1類驅動。這就是JDBC-ODBC橋的方式。
但這種方式不適合程序的重用與維護,不推薦使用。需要數據庫的ODBC驅動。
2:2類驅動。這就是JDBC+廠商API的形式。
廠商API一般使用C編寫,所以,這種方式也不長使用。
3:3類驅動。這就是JDBC+廠商Database Connection Server+DataBase的形式。
這種方法就是在JAVA 與 DATABASE之間價起了一臺專門用與數據庫連接的服務器(一般由數據庫廠商提供)。
他的好處在于能優化連接。
4:4類驅動。這就是純JDBC+DATABASE的連接方式。也是推薦的連接方式。
這使得APPLICATION與數據庫分開,開發者只需關心內部邏輯的實現而不需注重數據庫連接的具體實現。
在這其中有兩種連接的方式:硬編碼方式,就是在程序中硬性編入數據庫連接的所須參數。
JNDI DataSource方式。就是在程序運行的外布環境中又稱(Context)設置一個datasource數據源,有一個jndi 名稱,程序只須查找此名稱就可得到一個數據庫連接的對象。
Type 1: jdbc-odbc橋 Jdbc-odbc 橋 是sun公司提供的,是jdk提供的的標準api.
這種類型的驅動實際是把所有 jdbc的調用傳遞給odbc ,再由odbc調用本地數據庫驅動代碼.( 本地數據庫驅動代碼是指 由數據庫廠商提供的數據庫操作二進制代碼庫,例如在Oracle for windows中就是oci dll 文 件)
只要本地機裝有相關的odbc驅動那么采用jdbc-odbc橋幾乎可以訪問所有的數據庫,jdbc- odbc方法對于客戶端已經具備odbc driver的應用還是可行的。
但是,由于jdbc-odbc先調用 odbc再由odbc去調用本地數據庫接口訪問數據庫.所以,執行效率比較低,對于那些大數據量 存取的應用是不適合的.
而且,這種方法要求客戶端必須安裝odbc 驅動,所以對于基于 internet ,intranet的應用也是不合適的.因為,你不可能要求所有客戶都能找到odbc driver.
=====一般ACCESS用到的比較多,初學者用。實際項目是不用的
Type 2: 本地Api驅動
本地api驅動直接把jdbc調用轉變為數據庫的標準調用再去訪問數據庫。
這種方法需要本地 數據庫驅動代碼. 本地api驅動|廠商DB代碼---數據庫Server這種驅動比起jdbc-odbc橋執行效率大大提高了.
但是,它仍然需要在客戶端加載數據庫廠商 提供的代碼庫.這樣就不適合基于internet的應用.并且,他的執行效率比起3,4型的jdbc驅動 還是不夠高。
Type3:網絡協議驅動
這種驅動實際上是根據我們熟悉的三層結構建立的. jdbc先把對數局庫的訪問請求傳遞給網 絡上的中間件服務器. 中間件服務器再把請求翻譯為符合數據庫規范的調用,
再把這種調用傳給數據庫服務器.如果中間件服務器也是用java開發的,那么在在中間層也可以使用1,2型 jdbc驅動程序作為訪問數據庫的方法.
網絡協議驅動--中間件服務器---數據庫Server
由于這種驅動是基于server的.所以,它不需要在客戶端加載數據庫廠商提供的代碼庫.而且 他在執行效率和可升級性方面是比較好的.因為大部分功能實現都在server端,
所以這種驅動 可以設計的很小,可以非常快速的加載到內存中. 但是,這種驅動在中間件層仍然需要有配置 其它數據庫驅動程序,并且由于多了一個中間層傳遞數據,
它的執行效率還不是最好.
Type4 純JAVA驅動
這種驅動直接把jdbc調用轉換為符合相關數據庫系統規范的請求.由于4型驅動寫的應用可 以直接和數據庫服務器通訊.這種類型的驅動完全由java實現,
因此實現了平臺獨立性. 本地協議驅動---------數據庫Server
由于這種驅動不需要先把jdbc的調用傳給odbc或本地數據庫接口或者是中間層服務器.所以它的執行效率是非常高的.而且,它根本不需要在客戶端或服務器端裝載任何的軟件
或驅動. 這種驅動程序可以動態的被下載.但是對于不同的數據庫需要下載不同的驅動程序.
以上對四種類型的jdbc驅動做了一個說明.那么它們適合那種類型的應用開發呢?
提示:Jdbc-odbc橋由于它的執行效率不高,更適合做為開發應用時的一種過度方案,或著對于初學 者了解jdbc編程也較適用.
對于那些需要大數據量操作的應用程序則應該考慮2,3,4型驅動.在intranet方面的應用可以考慮2型驅動,
但是由于3,4型驅動在執行效率上比2型驅動有著明顯的優勢,而且目前開發 的趨勢是使用純java.所以3,4型驅動也可以作為考慮對象. 至于基于internet方面的應用就只有考慮3,4型驅動了.
因為3型驅動可以把多種數據庫驅動都配置在中間層服務器.所以3型驅動最適合那種需要同時連接多個不同種類的數據庫, 并且對并發連接要求高的應用.4型驅動則適合那些連接單一數據庫的工作組應用。
1. ODBC技術
1.1 ODBC介紹
ODBC(Open Database Connectivity,開放數據庫互 連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規范,并提供了一組對數據庫訪問的標準API(應用程序編程接口)。這些API利用 SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。
ODBD通過引進ODBC驅動當作應用程序與DBMS的中間翻譯層,來實現ODBC接口與DBMS的無關性。實現了ODBC接口的應用程序可以訪問任何安裝了ODBC驅動的DBMS。
應用程序要訪問一個數據庫,首先必須用ODBC管理器注冊一個數據源,管理器根據數據源提供的數據庫位置、數據庫類型及ODBC驅動程序等信息,建立起ODBC與具體數據庫的聯系。這樣,只要應用程序將數據源名提供給ODBC,ODBC就能建立起與相應數據庫的連接。
在64位系統中打開ODBC管理器的方法為:
(1)查看兼容的32位ODBC驅動:啟動 C:/Windows/SysWOW64/odbcad32.exe;
(2)查看64位ODBC驅動,啟動C:/WINDOWS/system32/odbcad32.exe 或者【控制面板】-【管理工具】-【數據源(ODBC)】。
1.2 ODBC的由來
早期數據庫訪問是由本機庫來執行的,例如SQL Server的DBLib以及Oracle的OCI(Oracle Call Interface,Oracle調用接口)。這樣能保證快速地訪問數據庫,但是不同的數據庫要使用不同的API來訪問,導致代碼通用性很差。
為了解決這個問題,1992年Microsoft和Sybase、Digital共同制定了ODBC標準接口,以單一的ODBC API來存取各種不同的數據庫。隨后ODBC便獲得了許多數據庫廠商和Third-Party的支持而逐漸成為標準的數據存取技術。
ODBC以當時的業界標準規范X/Open Call Level Interface(CLI)和ISO/IEC9075-3Call-LevelInterface(SQL/CLI)為涵蓋的范圍,因而支持了廣闊的數 據庫。雖然ODBC在初期的版本中執行效率不佳,而且功能有限,因此也為人們所貶低。但是,隨著Microsoft不斷地改善ODBC,使ODBC的執行 效率不斷增加,ODBC驅動程序的功能也日漸齊全。到目前,ODBC已經是一個穩定并且執行效率良好的數據存取引擎。不過ODBC僅支持關系數據庫,以及傳統的數據庫數據類型,并且只以C/C++語言API(API就是一些C語言的代碼,是最底層的程序,在windows中就是一些.dll的文件)形式提供服務,因而無法符合日漸復雜的數據存取應用,也無法讓腳本語言使用。因此Microsoft除了ODBC之外,也推出了其他的數據存取技術以滿足程序員不同的需要。(注:ODBC是面向過程的語言,由C語言開發出來,不能兼容多種語言,所以開發的難度大,而且只支持有限的數據庫公司,對于后來的EXCEL等根本不能支持)。
盡管可以編寫直接利用ODBC API的應用程序,但這是相當復雜的。為了避免這種復雜性,微軟引入了兩個對象模型:DAO(Data Access Object)與RDO(Remote DataObject),可以通過過程性的ODBC API實現面向對象的訪問。
2. OLE-DB技術
2.1 OLE DB的由來
隨著數據源日益復雜化,現今的應用程序很可能需要從不同的數據源取得數據,加以處理,再把處理過的數據輸出到另外一個數據源中。更麻煩的是這些數據 源可能不是傳統的關系數據庫,而可能是Excel文件,Email,Internet/Intranet上的電子簽名信息。Microsoft為了讓應用 程序能夠以統一的方式存取各種不同的數據源,在1997年提出了Universal Data Access(UDA)架構。UDA以COM技術為核心,協助程序員存取企業中各類不同的數據源。UDA以OLE-DB(屬于操作系統層次的軟件)作為技術的骨架。OLE-DB定義了統一的COM接口作為存取各類異質數據源的標準,并且封裝在一組COM對象之中。藉由OLE-DB,程序員就可以使用一致的方式來存取各種數據。但仍然OLEDB是一個低層次的,利用效率不高。
2.2 OLE DB的介紹
OLE DB(Object Linking and Embedding, Database,即對象連接與嵌入)是微軟的戰略性的通向不同的數據源的低級應用程序接口。OLE DB不僅包括微軟資助的標準數據接口開放數據庫連通性(ODBC)的結構化查詢語言(SQL)能力,還具有面向其他非SQL數據類型的通路。作為微軟的組 件對象模型(COM)的一種設計,OLE DB是一組讀寫數據的方法(在過去可能被稱為渠道)。OLD DB中的對象主要包括數據源對象、階段對象、命令對象和行組對象。使用OLEDB的應用程序會用到如下的請求序列:初始化OLE連接到數據源à發出命令à 處理結果à釋放數據源對象并停止初始化OLE。
OLE DB標準中定義的新概念——OLE DB將傳統的數據庫系統劃分為多個邏輯組件,這些組件之間相對獨立又相互通信。這種組件模型中的各個部分被冠以不同的名稱,例如數據提供者(Data Provider)是指提供數據存儲的軟件組件,小到普通的文本文件、大到主機上的復雜數據庫,或者電子郵件存儲,都是數據提供者的例子。有的文檔把這些 軟件組件的開發商也稱為數據提供者。
我們要開啟如Access數據庫中的數據,必須用ADO.NET通過OLE DB來開啟。ADO.Net 利用OLE DB來取得數據,這是因為OLE DB了解如何和許多種數據源作溝通,所以對OLE DB有相當程度的了解是很重要的。
OLEDB 為一種開放式的標準,并且設計成COM(ComponentObject Model,一種對象的格式。凡是依照COM 的規格所制作出來的組件,皆可以提供功能讓其它程序或組件所使用。)組件。OLEDB 最主要是由三個部分組合而成:
(1)Data Providers數據提供者
地位相當于ODBC的驅動程序,負責從數據源中提供數據。凡是透過OLEDB將數據提供出來的,就是數據提供者。例如SQL Server 數據庫中的數據表,或是附文件名為mdb 的Access 數據庫檔案等,都是Data Provider。
(2)Data Consumers數據使用者
凡是使用OLEDB 提供數據的程序或組件,都是OLEDB 的數據使用者。換句話說,凡是使用ADO 的應用程序或網頁都是OLE DB 的數據使用者。
(3)Service Components服務組件
數據服務組件可以執行數據提供者以及數據使用者之間數據傳遞的工作,數據使用者要向數據提供者要求數據時,是透過OLEDB 服務組件的查詢處理器執行查詢的工作,而查詢到的結果則由指針引擎來管理。
2.3 OLE DB和ODBC的區別
由于OLEDB和ODBC標準都是為了提供統一的訪問數據接口,所以曾經有人疑惑:OLE DB是不是替代ODBC的新標準?答案是否定的。實際上,ODBC標準的對象是基于SQL的數據源(SQL-Based Data Source),而OLE DB的對象則是范圍更為廣泛的任何數據存儲。從這個意義上說,符合ODBC標準的數據源是符合OLE DB標準的數據存儲的子集。
3. ADO技術
3.1 ADO的由來
雖然OLE-DB允許程序員存取各類數據,是一個非常良好的架構,但是由于OLE-DB太底層化,而且在使用上非常復雜,需要程序員擁有高超的技 巧,因此只有少數的程序員才有辦法使用OLE-DB。這讓OLE-DB無法廣為流行。為了解決這個問題,并且讓VB和腳本語言也能夠藉由OLE-DB存取 各種數據源,Microsoft同樣以COM技術封裝OLE-DB為ADO對象(這一步是很重要的,實現了多種程序可以互相調,并且可以開發的語言也豐富 了),簡化了程序員數據存取的工作。由于 ADO成功地封裝了OLE-DB大部分的功能,并且大量簡化了數據存取工作,因此 ADO也逐漸被愈來愈多的程序員所接受。
3.2 ADO的介紹
微軟公司的ADO(ActiveX Data Objects)是一個用于存取數據源的COM組件。它提供了編程語言和統一數據訪問方式OLE DB的一個中間層。允許開發人員編寫訪問數據的代碼而不用關心數據庫是如何實現的,而只用關心到數據庫的連接。訪問數據庫的時候,關于SQL的知識不是必要的,但是特定數據庫支持的SQL命令仍可以通過ADO中的命令對象來執行。
ADO被設計來繼承微軟早期的數據訪問對象層,包括RDO(Remote Data Objects)和DAO(Data Access Objects)。ADO在1996年冬被發布。
ADO包括了6個類:Connection,Command,Recordset,Errors,Parameters,Fields。
說通俗點OLE DB和ODBC都是最底層的東西,而ADO對象給我們提供了一個“可視化”地和應用層直接交互的組件,我們不用過多的關注OLEDB的內部機制,只需要了 解ADO通過OLE DB創建數據源的幾種方法即可,就可以通過ADO輕松地獲取數據源。可以說ADO是應用程序和數據底層的一個中間層,ADO對象通過OLE DB間接取得數據庫中的數據。OLE DB只是提供了通向各種數據庫的一個通用接口,簡單的可以用圖1來表示:
圖1 采用ADO和OLEDB訪問數據源
4. ADO.NET技術
ADO和ADO.NET的目的都是為編寫數據源訪問程序提供支持,但它們是兩種完全不同的技術。
ADO使用OLE
DB接口并基于微軟的COM技術,而ADO.NET基于微軟的.NET體系架構,擁有自己的ADO.NET數據庫訪問接口。眾所周知.NET體系不同于
COM體系,ADO.NET接口也就完全不同于ADO和OLE DB接口,這也就是說ADO.NET和ADO是兩種數據訪問方式。
在開始設計.NET體系架構時,微軟就決定重新設計數據訪問模型,以便能夠完全的基于XML和離線計算模型。兩者的區別主要有:
(1)ADO以Recordset存儲,而ADO.NET則以DataSet存儲。Recordset看起來更像單表,如果讓Recordset以多表的方式表示就必須在SQL中進行多表連接。反之,DataSet可以是多個表的集合。
(2)ADO的運作是一種在線方式,這意味著不論是瀏覽或更新數據都必須是實時的。ADO.NET則使用離線方式,在訪問數據的時候ADO.NET會利用XML制作數據的一份副本,ADO.NET的數據庫連接也只有在這段時間需要在線。
(3)由于ADO使用COM技術,這就要求所使用的數據類型必須符合COM規范,而ADO.NET基于XML格式,數據類型更為豐富并且不需要再做COM編排導致的數據類型轉換,從而提高了整體性能。
圖2描繪了ADO.NET體系。圖3給出了ADO.NET基于XML進行數據傳遞的原理圖。
圖2ADO.NET架構體系
圖3ADO.NET數據訪問原理
5. JDBC技術
5.1 JDBC介紹
JDBC(Java Database Connectivity,Java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。
JDBC與ODBC一樣,也是很底層的接口,可以直接調用SQL命令。在它之上可以建立高級接口和工具。高級接口是“用戶友好”的接口,它使用的是一種更易理解和更為方便的 API,這種API在幕后被轉換為諸如 JDBC 這樣的低級接口。
5.2 JDBC與ODBC對比
Microsoft 的 ODBC API 可能是使用最廣的、用于訪問關系數據庫的編程接口。它能在幾乎所有平臺上連接幾乎所有的數據庫。為什么
Java 不使用 ODBC?對這個問題的回答是:Java 可以使用 ODBC,但最好是在 JDBC
的幫助下以JDBC-ODBC橋的形式使用,原因是ODBC 不適合直接在 Java 中使用,因為它使用 C 語言接口。從Java 調用本地
C代碼在安全性、實現、堅固性和程序的自動移植性方面都有許多缺點。從ODBC C API 到 Java API的字面翻譯是不可取的。例如,Java
沒有指針,而 ODBC 卻對指針用得很廣泛(包括很容易出錯的指針"void *")。
JDBC與ODBC都是基于X/Open的SQL調用級接口, JDBC的設計在思想上沿襲了ODBC,同時在其主要抽象和SQL CLI實現上也沿襲了ODBC,這使得JDBC容易被接受。JDBC的總體結構類似于ODBC,也有四個組件:應用程序、驅動程序管理器、驅動程序和數據源。
JDBC保持了ODBC的基本特性,也獨立于特定數據庫。使用相同源代碼的應用程序通過動態加載不同的JDBC驅動程序,可以訪問不同的DBMS。
連接不同的DBMS時,各個DBMS之間僅通過不同的URL進行標識。JDBC的
DatabaseMetaData接口提供了一系列方法,可以檢查DBMS對特定特性的支持,并相應確定有什么特性,從而能對特定數據庫的特性予以支持。
與ODBC一樣,JDBC也支持在應用程序中同時建立多個數據庫連接,采用JDBC可以很容易地用SQL語句同時訪問多個異構的數據庫,為異構的數據庫之
間的互操作奠定基礎。
ODBC很難學。它把簡單和高級功能混在一起,而且即使對于簡單的查詢,其選項也極為復雜。相反,JDBC
盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。如果使用ODBC,就必須手動地將ODBC驅動程序管理器和驅動程序安裝在每臺客戶機上。如
果完全用Java編寫JDBC驅動程序則JDBC代碼在所有Java平臺上(從網絡計算機到大型機)都可以自動安裝、移植并保證安全性。JDBC確保了
“100%純Java”的解決方案,利用Java的平臺無關性,
JDBC應用程序可以自然地實現跨平臺特性,因而更適合于Internet上異構環境的數據庫應用。此外,JDBC驅動程序管理器是內置的,驅動程序本身
也可通過Web瀏覽器自動下載,無須安裝、配置;而ODBC驅動程序管理器和ODBC驅動程序必須在每臺客戶機上分別安裝、配置。
目前,Microsoft又引進了ODBC之外的新API: RDO、ADO和OLE
DB。這些設計在許多方面與JDBC是相同的,即它們都是面向對象的數據庫接口且基于可在ODBC上實現的類。但在這些接口中,我們未看見有特別的功能使
我們要轉而選擇它們來替代ODBC,尤其是在ODBC驅動程序已建立起較為完善的市場的情況下。它們最多也就是在ODBC上加了一種裝飾而已。
6. ODAC
ODAC全稱Oracle數據訪問組件(Oracle Data Access
Components),是由Oracle官方提供的在.NET環境下進行Oracle數據庫編程的一套工具組件。ODAC完全包括了開發所用的組件,例
如ODP.NET、ODT、Oracle Provider for OLE DB等工具,見下圖所示:
圖4ODAC組件內容
其中,ODP.NET提供了比ADO.NET更為優化的oracle數據庫訪問功能。具體見7.1.4;ODT則是Microsoft
Visual Studio 2015,Visual Studio 2013, and Visual Studio
2012的oracle數據庫開發插件。
ODAC的下載地址為http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html。可以通過Oracle Universal Installer、xcopy、NuGet或者Microsoft Installer進行安裝。
7. Oracle數據庫訪問技術
7.1 在.NET環境下訪問Oracle
7.1.1 ODBC方式
首先下載instantclient-basic-win32-11.2.0.1.0.zip和instantclient-odbc-
win32-11.2.0.1.0.zip兩個文件,將它們解壓,放到同一個文件夾下面,運行odbc_install.exe安裝。注意,oracle
要與其odbc驅動的位數要匹配,如果不匹配則會報“體系結構不匹配”的錯誤。
安裝完成后,我們可以在【控制面板】-->【管理工具】-->【數據源(ODBC)】-->【系統DSN】中查看系統中已經安裝好的ODBC驅動,其中就包含了“Microsoft ODBC Driver for Oracle”。
連接字符串格式:
[java] view plain copy
Driver={MicrosoftODBCforOracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;
要求:必須安裝oracle 7.3版(或更高)的客戶端。
7.1.2 OLEDB方式
打開注冊表編輯器,搜索oracle即可以搜索到以下鍵:
Microsoft OLE DBProvider for Oracle
HKEY_CLASSES_ROOTCLSID{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}OLEDB Provider
HKEY_CLASSES_ROOTMSDAORA
所以,只要安裝了合適版本的MDAC,那么就可以使用OLEDB來訪問ORACLE了。
連接字符串格式:
[java] view plain copy
Provider=msdaora;DataSource=MyOracleDB;UserId=myUsername;Password=myPassword;
要求:必須安裝oracle 8i版(或更高)的客戶端。
7.1.3 OracleClient方式
OracleClient(System.Data.OracleClient)是微軟針對Oracle開發所研發的ADO.NET Data
Provider,從.NET 1.x開始,就已成為.NETFramework類庫的一部分,它與微軟Visual Studio
的集成性非常好。但是從.NET 4以后的版本中將會移除該類庫,不再提供OracleClient的支持。
7.1.4 ODP.NET方式
全稱Oracle Data Provider for .net,就是Oracle 為 .NET(ODP.NET) 專門編寫了 Oracle Data Provider,一個用于 Microsoft .NET 環境下的 Oracle 數據訪問 API 。
要想從 Oracle 所支持的企業應用程序獲得預期的響應性能和高級數據庫特性,應該選擇 Oracle
專用的連接而不是一般的數據庫連接。Java 開發人員長期以來一直可以選擇使用 Oracle 提供的專用 API 連接到 Oracle
數據庫,這些 API 擴展了 JDBC 并為開發人員利用如大型對象 (LOB) 和 Ref Cursor 這樣的 Oracle
高級特性提供了一條途徑。
2002 年 2 月,Microsoft 推出了 Visual Studio .NET 及其三種語言(C# .NET、Visual
Basic .NET 和 C++ .NET)以及底層的 .NET 框架。Microsoft .NET 為建立企業級的桌面、Web 和
client/server 應用程序提供了一個面向對象的開發平臺。不幸的是,使用這些 Microsoft 語言和 .NET
框架的開發人員并沒有一個現成的、專用于 Oracle 的數據庫連接選項。
針對這一問題,Oracle 為 .NET(ODP.NET) 專門編寫了 Oracle Data Provider,一個用于
Microsoft .NET 環境下的 Oracle 數據訪問 API。在本文中,我們將討論 ODP.NET
的用法、特性和對性能的改善。我們發現使用 ODP.NET 確實具有一些顯著的優勢。
如果用ODP.NET來訪問ORACLE數據庫,需要滿足以下條件:
l 操作系統WIN XP 2003;
l .NET FRAMEWORK 1.0以上;
l ORACLE9I以上的客戶端。
連接字符串格式:
[java] view plain copy
DataSource=MyOracleDB;UserId=myUsername;Password=myPassword;IntegratedSecurity=no;
7.2 在JAVA環境下訪問Oracle
在Java環境下主要通過JDBC連接Oracle。連接方式主要有兩種。
(1)使用JDBC thin連接
thin是for thin client的意思,這種驅動一般用在運行于WEB瀏覽器中的JAVA程序。它不是通過OCI or
Net8,而是通過Javasockets進行通信,是純java實現的驅動,因此與平臺無關,不需要在使用JDBC
Thin的客戶端機器上安裝Oracle客戶端軟件,只需要下載一個thin驅動的jar包,并且將環境變量中的CLASS_PATH變量中加入thin
驅動的路徑就可以了。所以有很好的移植性,通常用在web開發中。
Thin驅動雖然與平臺無關,也無需安裝Oracle客戶端,但是有一個致命的缺陷就是性能一般,達不到如OCI方式的企業級的要求。另外,如果一
個oracle數據庫對應一臺主機,可以使用thin連接;如果一個oracle數據庫對應四五臺主機(集群服務器),使用thin時,需要把
tnsnames.ora文件中的相關數據庫的整個連接字符串都拷貝下來,如此才能連接上oracle集群數據庫。
設置連接字符串是固定的寫法,如下所示:
[java] view plain copy
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@10.87.134.107:1521:ora9","sms","zzsms");
在上面的連接字符串中,如果不是集群數據庫就在@后直接輸入數據庫IP地址即可;如果是集群數據庫,則需要在@后輸入tnsnames.ora文件中有關該數據庫的所有描述內容(通常是=后邊的所有的內容)。
(2)使用JDBC OCI連接
OCI是oracle call interface的縮寫,此驅動類似于傳統的ODBC驅動。因為它需要Oracle Call
Interface and
Net8,所以它需要在運行使用此驅動的JAVA程序的機器上安裝客戶端軟件,其實主要是用到oracle客戶端里以dll方式提供的oci和服務器配
置。
使用OCI連接數據庫是企業級的做法,適應于單個數據庫和集群數據庫,性能優越,尤其是連接池功能大大提高了應用程序的性能和并發量。唯一的缺點是,若想使用OCI必須要安裝Oracle客戶端。
安裝完Oracle客戶端后,里面有個jdbc的文件夾,該文件夾下就包含了OCI驅動和THIN驅動。所以是不需要去網上下載的。這個驅動在
jdbc/lib文件夾下,主要有classes12.jar、nls_charset12.jar等等。其中以12結尾的驅動包適應于jdk1.1以上
的版本。以11結尾的適應于jdk1.1以下的版本。文件名中含有classes的jar包就是驅動程序,文件名中含有nls的jar包是與國際化有關的
類。
找到文件后,就需要把class和nls的jar包的絕對路徑加入CLASS_PATH環境變量,否則會報ClassNotFound的異常。
設置環境變量后,就可以直接使用OCI驅動了。不要被“驅動”兩個字嚇壞了,驅動就是一個可執行文件和一個連接字符串。很簡單,無非是連接字符串的問題。標準的連接字符串如下所示:
[java] view plain copy
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectioncon=DriverManager.getConnection("jdbc:oracle:oci:@xxzc","duansiyuan","oracle_password");
只要這兩行,就可以保證連接到數據庫,而這個數據庫不管是單個數據庫還是集群數據庫。其中xxzc就是數據庫名,duansiyuan就是用戶名,oralce_password就是密碼。這種方式和C#中的方式比較類似。
需要注意的問題:
1、oracle_home/jdbc文件夾下有大量的樣板代碼和幫助文檔,里面對如何安裝和使用jdbc都有詳細的說明,請引起高度重視并耐心閱讀。里面有很多知識僅通過自己反復的實踐是無法獲取的。
2、如果想要高性能,請使用OCI連接,如果不想裝Oracle客戶端,請使用thin連接。
參考資料
[1] ODBC、OLE DB、ADO的區別,http://blog.csdn.net/yinjingjing198808/article/details/7665577
[2] ADO與ADO.NET的區別與介紹,http://www.jb51.net/article/34121.htm
[3] ADO和ADO.NET的區別,http://blog.csdn.net/luckyzhoustar/article/details/24770423
[4] JDBC和ODBC,http://www.tongji.edu.cn/~yangdy/database/paper6.htm
[5] 使用 ODP.NET 訪問 Oracle http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html
總結
以上是生活随笔為你收集整理的连接访问数据库的技术方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Partition学习笔记
- 下一篇: VPS速度测试(4):上传下载速度、服务