JDBC 3.0 有什麼新特性 (轉)

amyz發表於2007-11-25
JDBC 3.0 有什麼新特性 (轉)[@more@]

後設資料
後設資料 API 已經得到,DatabaseMetaData 介面現在可以檢索 型別的層次結構,一種新的 ParameterMetaData 介面可以描述 PreparedStatement 中引數的型別和屬性。

CallableStatements 中已命名的引數
在 JC 3.0 之前,設定一個過程中的一個引數要指定它的值,而不是它的名稱。 CallableStatement 介面已經被更新了,現在您可以用名稱來指定引數。

資料型別的改變
所支援的資料型別作了幾個改變,其中之一是增加了兩種新的資料型別。

為了便於修改 CLOB(Character Large ,字元型巨物件)、BLOB(Binary Large OBject,二進位制巨物件)和 REF(SQL 結構)型別的值,同名的資料型別介面都被更新了。接下來的是,因為我們現在能夠更新這些資料型別的值,所以 ResultSet 介面也被修改了,以支援對這些資料型別的列的更新,也包括對 ARRAY 型別的更新。

增加的兩種新的資料型別是 .sql.Types.DATALINKjava.sql.Types.BOOLEAN。新增的資料型別指的是同名的 SQL 型別。DATALINK 提供對外部資源的訪問或 URL,而 BOOLEAN 型別在邏輯上和 BIT 型別是等同的,只是增加了在語義上的含義。DATALINK 列值是透過使用新的 getURL() 方法從 ResultSet 的一個例項中檢索到的,而 BOOLEAN 型別是透過使用 getBoolean() 來檢索的。



檢索自動產生的關鍵字
為了解決對獲取自動產生的或自動增加的關鍵字的值的需求,JDBC 3.0 API 現在將獲取這種值變得很輕鬆。要確定任何所產生的關鍵字的值,只要簡單地在語句的 execute() 方法中指定一個可選的標記,表示您有興趣獲取產生的值。您感興趣的程度可以是 Statement.RETURN_GENERATED_KEYS,也可以是 Statement.NO_GENERATED_KEYS。在這條語句後,所產生的關鍵字的值就會透過從 Statement 的例項方法 getGeneratedKeys() 來檢索 ResultSet 而獲得。ResultSet 包含了每個所產生的關鍵字的列。清單 1 中的示例建立一個新的作者並返回對應的自動產生的關鍵字。

聯結器關係
大多數應用開發人員不需要知道 JDBC 和 連結器體系結構之間的關係,就可以很好地使用 JDBC API。但是,由於 JDBC 3.0 規範已經考慮到這項新的體系結構,這使得開發人員能更好地理解 JDBC 在哪裡適合 J2EE 標準,以及這個規範的發展方向是什麼。

J2EE 連結器體系結構指定了一組,允許企業的資訊以一種可插入的方式連線到應用上。這種體系結構定義了負責與外部系統連線的資源介面卡。聯結器服務提供者介面(The Connectors Service Provr Interface,SPI)恰好和 JDBC 介面提供的服務緊密配合。

JDBC API 實現了連結器體系結構定義的三個協議中的兩個。第一個是將應用程式與後端系統相連線的連線管理,它是由 DataConnectionPoolDataSource 介面來實現的。第二個是支援對資源的事務性訪問的事務管理,它是由 XADataSource 來處理的。第三個是支援後端系統的訪問的安全性管理,在這點上,JDBC 規範並沒有任何對應點。儘管有最後那個不足,JDBC 介面仍能對映到聯結器 SPI 上。如果一個程式廠商將其 JDBC 驅動程式對映到聯結器系統協議上,它就可以將其驅動程式部署為資源介面卡,並立刻享受可插性、封裝和在應用伺服器中部署的好處。這樣,一個標準的 API 就可以在不同種類的的企業資訊系統中,供企業開發人員使用。

ResultSet 可保持性
一個可保持的遊標(或結果),就是說該遊標在包含它的事務被提交後,也不會自動地關閉。JDBC 3.0 增加了對指定遊標可保持性的支援。要制定您 ResultSet 的可保持性,您必須在使用 createStatement()prepareStatement()prepareCall() 方法準備編寫一條語句時就這麼做。可保持性可以是下面常量中的一個。

HOLD_CURSORS_OVER_COMMIT ResultSet 物件(遊標)沒有被關閉;它們在提交操作得到顯式的或隱式的執行以後仍保持開啟的狀態。 CLOSE_CURSORS_AT_COMMIT ResultSet 物件(遊標)在提交操作得到顯式的或隱式的執行後被關閉。

總的來說,在事務提交之後關閉遊標操作會帶來更好的。除非您在事務結束後還需要該遊標,否則您最好在執行提交操作後將其關閉。因為規範沒有規定 ResultSet 的預設的可保持性,所以具體行為還將取決於執行情況。然而,我希望在可以使用 JDBC 3.0 驅動程式時,大多數執行在事務結束後仍舊會關閉遊標。

返回多重結果
JDBC 2 規範的一個侷限是,在任意時刻,返回多重結果的語句只能開啟一個 ResultSet。作為 JDBC 3.0 規範中改變的一個部分,規範將允許 Statement 介面支援多重開啟的 ResultSets。然而,重要的是 execute() 方法仍然會關閉任何以前 execute() 中開啟的 ResultSet。所以,要支援多重開啟的結果,Statement 介面就要加上一個過載的 getMoreResults() 方法。新式的方法會做一個整數標記,在 getResultSet() 方法被呼叫時指定前一次開啟的 ResultSet 的行為。介面將按如下所示定義標記:

CLOSE_ALL_RESULTS 當呼叫 getMoreResults() 時,所有以前開啟的 ResultSet 物件都將被關閉。 CLOSE_CURRENT_RESULT 當呼叫 getMoreResults() 時,當前的 ResultSet 物件將被關閉。 KEEP_CURRENT_RESULT 當呼叫 getMoreResults() 時,當前的 ResultSet 物件將不會被關閉。

 

連線池
JDBC 3.0 定義了幾個標準的連線池屬性。開發人員並不需要直接地用 API 去修改這些屬性,而是透過應用伺服器或資料儲存裝置來實現。由於開發人員只會間接地被連線池屬性的標準化所影響,所以有利之處並不明顯。然而,透過減少廠商特定設定的屬性的數量並用標準化的屬性來代替它們,開發人員能更容易地在不同廠商的 JDBC 驅動程式之間進行。另外,這些屬性還允許管理員很好地連線池,從而使應用程式的效能特點發揮到極致。這些屬性如下表所示。

屬性名稱描述 maxStatements 連線池可以保持開啟的語句數目。 initialPoolSize 當池初始化時可以建立的物理連線的數目。 minPoolSize 池可以包含的物理連線的最小數目。 maxPoolSize 池可以包含的物理連線的最大數目。零指沒有最大值。 maxIdleTime 持續時間,以秒計,指一個閒置的物理連線在被關閉前可以在池中停留的時間。零指沒有限制。 propertyCycle 間隔時間,以秒計,指連線池在執行其屬性策略前可以等待的時間。

預備語句池
除了改進對連線池的支援以外,現在也能緩衝預備語句了。預備語句允許您用一條常用的 SQL 語句然後預編譯它,從而在這條語句被多次執行的情況下大幅度地提升效能。在另一個方面,建立一個 PreparedStatement 物件會帶來一定量的系統開銷。所以,在理想情況下,這條語句的生命週期應該足夠長,以補償它所帶來的系統開銷。追求效能的開發人員有時候為了延長 PreparedStatement 物件的生命週期會不惜扭曲他們的物件模型。JDBC 3.0 讓開發人員不再為此擔心,因為資料來源層現在負責為預備語句進行快取。

也許在 JDBC 3.0 中最令人興奮的附加特點就是 Savepoint 了。JDBC 2 中的事務支援讓開發人員可以控制對資料的併發訪問,從而保證持續資料總是保持一致的狀態。可惜的是,有時候需要的是對事務多一點的控制,而不是在當前的事務中簡單地對每一個改變進行回滾。在 JDBC 3.0 下,您就可以透過 Savepoint 獲得這種控制。Savepoint 介面允許您將事務分割為各個邏輯斷點,以控制有多少事務需要回滾。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984534/,如需轉載,請註明出處,否則將追究法律責任。

相關文章