第四章 概述
JDBC應用程序接口為Java編程語言訪問一個或多個數據源提供了一種途徑。在大多數情況下,數據源是用SQL訪問的關系數據庫管理系統。盡管如此,支持JDBC技術的驅動程序也可以訪問其他的數據源,包括遺留文件系統(legacy file systems)和面向對象的系統。JDBC應用程序接口的一個主要動機就是為應用程序可以訪問廣泛的數據源提供標準的應用程序接口(API)。
這一章介紹了一些JDBC應用程序接口的關鍵概念。除此之外,還描述了JDBC應用程序的兩種運行環境,以及討論了不同的功能角色在每個運行環境中是怎樣被實現的。兩層和三層邏輯結構能夠在大量的物理結構上被實現。
4.1建立一個連接
JDBC應用程序接口定義了Connection接口來表示一個到潛在數據源的連接。
在典型情況下,JDBC應用程序會用兩種方式中的一種來連接到目標數據源:
■ DriverManager —— 這個被充分實現的類在最初的JDBC1.0應用程序接口中介紹過,它需要應用程序裝載一個特定的驅動,這一驅動使用硬編碼的統一資源定位器(URL)。
■ DataSource —— 這個接口在JDBC2.0可選包應用程序接口(Optional Package API)中介紹過。與DriverManager相比它被作為首選,因為他允許潛在數據源的細節對應用程序透明。一個DataSource對象的屬性被設置以后可以表示一個特定的數據源。當它的getConnection方法被調用以后,Datasource的實例將會返回一個到數據源的連接。應用程序可以通過改變Datasource對象的屬性來連接到不同的數據源,而不需要改變應用程序的代碼。同樣的,一個DataSource可以在不改變使用它的應用程序的代碼的前提下被改變。
JDBC應用程序接口還定義了DataSource接口的兩個重要擴展來支持企業級的應用程序。這些擴展就是以下的兩個接口:
■ ConnectionPoolDataSource —— 支持物理連接高速緩沖和重用,物理連接改善了應用程序的性能和可伸縮性。
■ XADataSource —— 提供了在分布式事務中可共享的連接。
4.2執行SQL表達式以及操作結果集
一旦一個連接被建立,那么使用這個連接的應用程序就可以用JDBC應用程序接口對目標數據源進行查詢和更新。JDBC3.0應用程序接口提供了對大多數實現了的SQL99特性的支持。因為不同的廠商都在不同的級別支持這些特性,而JDBC應用程序接口則包括了DatabaseMetadata接口。應用程序能夠使用此接口來確定它們使用的數據源是否支持某一特性。JDBC應用程序接口還定義了轉義語法使得應用程序可以訪問非標準的廠商定義的特性。轉義語法的優點是可以使得JDBC應用程序能夠像本地應用程序一樣訪問相同的特性,而同時又能夠保證應用程序的可移植性。
應用程序使用Connection接口中的方法來定義事務的屬性和創建Statement,PreparedStatement和CallableStatement對象。這些表達式被用來執行SQL表達式和檢索結果集。ResultSet接口封裝SQL的查詢結果。表達式也可以被批量執行,即允許應用程序向數據源提交多條更新語句作為執行的單個單元。
JDBC應用程序接口用RowSet接口擴展了ResultSet接口,從而為列表數據提供了一個容器,而這樣比標準結果集更加通用。一個Rowset對象是一個JavaBeans™組件,它可以在沒有連接到數據源的情況下對它進行操作。例如,一個RowSet可以被串行化,因此也可以在網絡之間被傳輸,這對那些想不需要JDBC驅動和數據源連接而對表格數據進行操作的小型客戶端是非常有用的。RowSet的另一個特性是能夠包含一個閱讀器來訪問任意表格形式的數據,而不僅僅是關系數據庫中的數據。更進一步的,一個RowSet對象可以在當它與數據源失去連接的時候更新它的行。它可以包含一個記錄器,把那些更新寫回到潛在的數據源。
4.2.1 支持SQL高級數據類型
JDBC應用程序接口定義了標準的從SQL數據類型到JDBC數據類型的映射。這包括對SQL99高級數據類型的支持,諸如BLOB,CLOB,ARRAY,REF,STRUCT和DISTINCT。JDBC驅動也可以為用戶定義類型(UDTs)實現一個或多個自定義類型映射。在這個映射中,用戶定義類型(UDT)被映射到一個Java類中。JDBC3.0應用程序接口還添加了對外部數據管理的支持,例如一個在數據源外部的文件中的數據。
4.3兩層結構模型
一個兩層結構模型按功能可以被劃分為客戶端層和服務器層,見圖4-1。
圖4-1 兩層結構模型
客戶端層包括了應用程序和一個或多個JDBC驅動,應用程序負責對以下職責進行處理:
■ 表現層邏輯
■ 業務邏輯
■ 對多重事務和分布式事務的管理
■ 資源管理
在這個模型中,應用程序直接與JDBC驅動交互,包括建立和管理物理連接以及處理潛在的特定的數據源的細節。應用程序可以采用特殊的實現采用不標準的特性或性能調整的優點。
這個模型的一些缺點包括:
■ 伴隨著基礎結構和系統級的功能使得表現層邏輯和業務層邏輯不能分離。這就為使用一個好的體系結構來編寫可維護性好的產品代碼帶來了困難。
■ 因為采用了特定的數據庫實現,降低了應用程序的可移植性。而那些要求連接到多個數據庫的應用程序必須知道不同廠商的數據庫之間的差異。
■ 限制了可伸縮性。通常地,應用程序在結束之前將保持一個或多個到數據庫的物理連接,這樣就限制了它支持并發應用程序的數量。在這個模型中,性能,可伸縮性和可用性受到JDBC驅動和相應的數據源的限制。如果一個應用程序采用了多個驅動,它也可能需要知道每種驅動和數據源解決這些限制的不同方法。
4.4三層結構模型
三層模型結構為業務邏輯和基礎結構引入了中間層服務器,見圖4-2:
圖4-2 三層結構模型
這個體系結構被設計來為企業級的應用程序提高性能,可伸縮性和可用性。三個層的功能分別為:
1、 客戶端層 —— 為程序和人的交互實現表現層邏輯的一個層。Java程序,瀏覽器和掌上電腦(PDAs)是常見的客戶端實例。客戶端與中間層應用程序交互而且不需要包含任何與基礎結構和數據源相關的功能。
2、 中間層服務器 —— 中間層包括:
■ 和客戶端以及業務邏輯層交互的應用程序。如果該應用程序能夠與數據源交互,和低級的驅動應用程序接口相比,他將更多地處理像DataSource對象和邏輯連接這些高級抽象。
■ 為廣泛的應用程序提供基礎的應用程序服務器。這包括管理和共享物理連接、事務管理和屏蔽不同JDBC驅動之間的差異。最后一點使得編寫可移植性良好的應用程序更加簡單。J2EE服務器可以實現應用程序服務器這一角色。應用程序服務器可以實現被應用程序所使用的高級抽象和直接與JDBC驅動交互。
■ JDBC驅動提供到潛在數據源的連接。每個驅動程序在它所使用的數據源所支持的特性基礎上實現標準的JDBC應用程序接口。驅動層可以屏蔽標準SQL99語法和數據源所支持的本地語法之間的差異。如果數據源不是一個關系數據庫管理系統,那驅動程序則使用應用程序服務器實現關系層。
3、 潛在數據源 —— 即數據駐留層。它包括關系型數據庫管理系統,遺留文件系統(legacy file systems),對象型數據庫管理系統,數據倉庫,電子表格或者其他形式的數據。唯一的要求就是有相應的支持JDBC應用程序接口的驅動程序。
4.5在J2EE平臺中的JDBC
J2EE組件,例如JavaServer™ Pages,Servlets和企業級Java Beans™(EJB™)組件,常常需要使用JDBC應用程序接口來訪問關系型數據。當J2EE組件使用了JDBC應用程序接口以后,那么可以使用相應的容器來管理它們的事務和數據源。這意味著J2EE組件開發人員可以不直接使用JDBC應用程序接口的事務管理和數據源管理的工具。具體細節請參考J2EE平臺規范。