国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

JDBC3.0有什么新特性

2019-11-18 13:59:38
字體:
來源:轉載
供稿:網(wǎng)友

  概述 java 數(shù)據(jù)庫連接 3.0 規(guī)范的新功能和改進之處
Josh Heidebrecht(jheidebr@ca.ibm.com)
軟件工程師,IBM

Java 數(shù)據(jù)庫連接(Java Database Connectivity,JDBC)API 是作為 Java 2 標準版(Java 2 Standard Edition,J2SE)和 Java 2 企業(yè)版(Java 2 EnterPRise Edition,J2EE)平臺的一個要害部分出現(xiàn)的。它是一種主要的基于標準的機制,能讓 Java 語言通過編程來訪問關系數(shù)據(jù)庫,所以當 Java Community Process 發(fā)布一份新版本的規(guī)范時,開發(fā)人員一定會感愛好。在此,我們就 Sun Microsystems 最近發(fā)布的 JDBC 規(guī)范的提議最終草案(Proposed Final Draft)3.0 版本來總結一下它的一些新的主要功能。加入討論論壇,與作者和其他讀者分享您對本文的看法。
介紹
Java 數(shù)據(jù)庫連接(JDBC)3.0 規(guī)范建立在其原本穩(wěn)固的基礎上,增加了幾個新功能以彌補原來功能不足的地方。無論是 java.sql 還是第一次出現(xiàn)的 javax.sql 軟件包,都會包含在還處于測試階段的 Java 1.4 版平臺中。在今年晚些時候它就會被正式發(fā)布,到時 Java 開發(fā)人員就能夠利用這些改進了,所以現(xiàn)在正是開始了解這些改變的好時候。

我們會簡單地討論一下 JDBC 的設計師們?yōu)檫@個版本所考慮到的幾個設計目標。理解了設計師們的設計基本原理,我們就可以更好地去理解那些改變。我們會總結一下規(guī)范中的幾個新功能以便了解整個 API 是怎樣被改變的。另外,我們還會深入研究幾個最適用于應用程序開發(fā)人員的要害功能,以成功地協(xié)助您利用其新性能。

設計目標
設計 JDBC 3.0 規(guī)范的初衷主要是讓原先的 JDBC 規(guī)范下的功能更加完美。因此,這個新規(guī)范的設計指導原則之一就是要與現(xiàn)存的應用程序和驅動程序保持兼容性。所以,JDBC 2 的用戶可以放心,他們的應用程序能在 JDBC 3.0 下正確運行。另外,使用以前那些遭反對的方法寫進 JDBC 1 API 的代碼也可以繼續(xù)運行。

隨著 J2EE 平臺迅速的日益流行,設計師們也想增強 JDBC 的可伸縮性。新增的語句池和增強的連接池支持離實現(xiàn)這個目標還很遠。此外,設計師們還仔細地考慮 JDBC 與新的連接器體系結構之間的關系,來繼續(xù)提高服務器上的 Java 技術。

在 JDBC 2 開發(fā)的過程中,SQL99 還處在一種變化不定的情況下。現(xiàn)在規(guī)范已經(jīng)完成了,而且數(shù)據(jù)庫廠商已經(jīng)采用了部分標準。所以自然地,JDBC 規(guī)范就跟著將自己與 SQL99 功能的一部分相統(tǒng)一。最新的 JDBC 規(guī)范已經(jīng)采用了 SQL99 標準中那些已經(jīng)被廣泛支持的功能,還有那些在五年內可能會獲得支持的功能。

假如一個數(shù)據(jù)庫還不支持 JDBC 3.0 所支持的部分 SQL99 功能,驅動程序可以使用元數(shù)據(jù) API 向應用程序開發(fā)人員表明:其底層數(shù)據(jù)庫不支持一部分 JDBC 功能。這一點答應數(shù)據(jù)庫廠商生產(chǎn)出相應的 JDBC 驅動程序,盡管他們可能不支持所有的功能。增加的兩種新的數(shù)據(jù)類型以及對事務的 Savepoint 的支持說明了兩個和 SQL99 有關的改變。

新功能摘要

元數(shù)據(jù) API
元數(shù)據(jù) API 已經(jīng)得到更新,DatabaseMetaData 接口現(xiàn)在可以檢索 SQL 類型的層次結構,一種新的 ParameterMetaData 接口可以描述 PreparedStatement 對象中參數(shù)的類型和屬性。

CallableStatements 中已命名的參數(shù)
在 JDBC 3.0 之前,設置一個存儲過程中的一個參數(shù)要指定它的索引值,而不是它的名稱。 CallableStatement 接口已經(jīng)被更新了,現(xiàn)在您可以用名稱來指定參數(shù)。

數(shù)據(jù)類型的改變
JDBC 所支持的數(shù)據(jù)類型作了幾個改變,其中之一是增加了兩種新的數(shù)據(jù)類型。

為了便于修改 CLOB(Character Large OBject,字符型巨對象)、BLOB(Binary Large OBject,二進制巨對象)和 REF(SQL 結構)類型的值,同名的數(shù)據(jù)類型接口都被更新了。接下來的是,因為我們現(xiàn)在能夠更新這些數(shù)據(jù)類型的值,所以 ResultSet 接口也被修改了,以支持對這些數(shù)據(jù)類型的列的更新,也包括對 ARRAY 類型的更新。

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




檢索自動產(chǎn)生的要害字
為了解決對獲取自動產(chǎn)生的或自動增加的要害字的值的需求,JDBC 3.0 API 現(xiàn)在將獲取這種值變得很輕松。要確定任何所產(chǎn)生的要害字的值,只要簡單地在語句的 execute() 方法中指定一個可選的標記,表示您有愛好獲取產(chǎn)生的值。您感愛好的程度可以是 Statement.RETURN_GENERATED_KEYS,也可以是 Statement.NO_GENERATED_KEYS。在執(zhí)行這條語句后,所產(chǎn)生的要害字的值就會通過從 Statement 的實例方法 getGeneratedKeys() 來檢索 ResultSet 而獲得。ResultSet 包含了每個所產(chǎn)生的要害字的列。清單 1 中的示例創(chuàng)建一個新的作者并返回對應的自動產(chǎn)生的要害字。

清單 1. 檢索自動產(chǎn)生的要害字


Statement stmt = conn.createStatement();

// OBTain the generated key that results from the query.

stmt.executeUpdate("INSERT INTO authors " +

′(first_name, last_name) " +

"VALUES (′George′, ′Orwell′)",

Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();

if ( rs.next() ) {

// Retrieve the auto generated key(s).

int key = rs.getInt();

}








連接器關系
大多數(shù)應用程序開發(fā)人員不需要知道 JDBC 和 J2EE 連結器體系結構之間的關系,就可以很好地使用 JDBC API。但是,由于 JDBC 3.0 規(guī)范已經(jīng)考慮到這項新的體系結構,這使得開發(fā)人員能更好地理解 JDBC 在哪里適合 J2EE 標準,以及這個規(guī)范的發(fā)展方向是什么。

J2EE 連結器體系結構指定了一組協(xié)議,答應企業(yè)的信息系統(tǒng)以一種可插入的方式連接到應用服務器上。這種體系結構定義了負責與外部系統(tǒng)連接的資源適配器。連接器服務提供者接口(The Connectors Service Provider Interface,SPI)恰好和 JDBC 接口提供的服務緊密配合。

JDBC API 實現(xiàn)了連結器體系結構定義的三個協(xié)議中的兩個。第一個是將應用程序組件與后端系統(tǒng)相連接的連接治理,它是由 DataSource 和 ConnectionPoolDataSource 接口來實現(xiàn)的。第二個是支持對資源的事務性訪問的事務治理,它是由 XADataSource 來處理的。第三個是支持后端系統(tǒng)的安全訪問的安全性治理,在這點上,JDBC 規(guī)范并沒有任何對應點。盡管有最后那個不足,JDBC 接口仍能映射到連接器 SPI 上。假如一個驅動程序廠商將其 JDBC 驅動程序映射到連接器系統(tǒng)協(xié)議上,它就可以將其驅動程序部署為資源適配器,并馬上享受可插性、封裝和在應用服務器中部署的好處。這樣,一個標準的 API 就可以在不同種類的的企業(yè)信息系統(tǒng)中,供企業(yè)開發(fā)人員使用。

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

HOLD_CURSORS_OVER_COMMIT ResultSet 對象(游標)沒有被關閉;它們在提交操作得到顯式的或隱式的執(zhí)行以后仍保持打開的狀態(tài)。
CLOSE_CURSORS_AT_COMMIT ResultSet 對象(游標)在提交操作得到顯式的或隱式的執(zhí)行后被關閉。

總的來說,在事務提交之后關閉游標操作會帶來更好的性能。除非您在事務結束后還需要該游標,否則您最好在執(zhí)行提交操作后將其關閉。因為規(guī)范沒有規(guī)定 ResultSet 的缺省的可保持性,所以具體行為還將取決于執(zhí)行情況。然而,我希望在可以使用 JDBC 3.0 驅動程序時,大多數(shù)執(zhí)行在事務結束后仍然會關閉游標。

返回多重結果
JDBC 2 規(guī)范的一個局限是,在任意時刻,返回多重結果的語句只能打開一個 ResultSet。作為 JDBC 3.0 規(guī)范中改變的一個部分,規(guī)范將答應 Statement 接口支持多重打開的 ResultSets。然而,重要的是 execute() 方法仍然會關閉任何以前 execute() 調用中打開的 ResultSet。所以,要支持多重打開的結果,Statement 接口就要加上一個重載的 getMoreResults() 方法。新式的方法會做一個整數(shù)標記,在 getResultSet() 方法被調用時指定前一次打開的 ResultSet 的行為。接口將按如下所示定義標記:

CLOSE_ALL_RESULTS 當調用 getMoreResults() 時,所有以前打開的 ResultSet 對象都將被關閉。
CLOSE_CURRENT_RESULT 當調用 getMoreResults() 時,當前的 ResultSet 對象將被關閉。
KEEP_CURRENT_RESULT 當調用 getMoreResults() 時,當前的 ResultSet 對象將不會被關閉。

清單 2 展示的是一個處理多重打開結果的示例。

清單 2. 如何處理多重打開結果


String procCall;

// Set the value of procCall to call a stored procedure.

// ...



CallableStatement cstmt = connection.prepareCall(procCall);

int retval = cstmt.execute();

if (retval == false) {

// The statement returned an update count, so handle it.

// ...

} else { // ResultSet

ResultSet rs1 = cstmt.getResultSet();

// ...



retval = cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);

if (retval == true) {

ResultSet rs2 = cstmt.getResultSet();



// Both ResultSets are open and ready for use.

rs2.next();

rs1.next();

// ...

}

}








連接池
JDBC 3.0 定義了幾個標準的連接池屬性。開發(fā)人員并不需要直接地用 API 去修改這些屬性,而是通過應用服務器或數(shù)據(jù)存儲設備來實現(xiàn)。由于開發(fā)人員只會間接地被連接池屬性的標準化所影響,所以有利之處并不明顯。然而,通過減少廠商特定設置的屬性的數(shù)量并用標準化的屬性來代替它們,開發(fā)人員能更輕易地在不同廠商的 JDBC 驅動程序之間進行交換。另外,這些屬性還答應治理員很好地優(yōu)化連接池,從而使應用程序的性能特點發(fā)揮到極致。這些屬性如下表所示。

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

預備語句池
除了改進對連接池的支持以外,現(xiàn)在也能緩沖預備語句了。預備語句答應您用一條常用的 SQL 語句然后預編譯它,從而在這條語句被多次執(zhí)行的情況下大幅度地提升性能。在另一個方面,建立一個 PreparedStatement 對象會帶來一定量的系統(tǒng)開銷。所以,在理想情況下,這條語句的生命周期應該足夠長,以補償它所帶來的系統(tǒng)開銷。追求性能的開發(fā)人員有時候為了延長 PreparedStatement 對象的生命周期會不惜扭曲他們的對象模型。JDBC 3.0 讓開發(fā)人員不再為此擔心,因為數(shù)據(jù)源層現(xiàn)在負責為預備語句進行緩存。

清單 3 將示范如何利用 JDBC 對預備語句池的支持。細心的讀者可能會發(fā)現(xiàn)清單中的語句和普通 JDBC 2 的代碼沒什么兩樣。這是因為語句的緩沖是完全在內部實現(xiàn)的。這就意味著,在 JDBC 3.0 下,您現(xiàn)存的代碼可以自動利用語句池。但可惜的是,這也意味著您將不能控制哪個預備語句將被緩沖,而只能控制被緩存的語句的數(shù)目。

清單 3. 緩沖預備語句


String INSERT_BOOK_QUERY = "INSERT INTO BOOKLIST " +

′(AUTHOR, TITLE) " +

"VALUES (?, ?) ";

Connection conn = aPooledConnection.getConnection();

PreparedStatement ps = conn.prepareStatement(INSERT_BOOK_QUERY);

ps.setString(1, "Orwell, George");

ps.setString(2, "1984");

ps.executeUpdate();

ps.close();

conn.close();



// ...



conn = aPooledConnection.getConnection();

// Since the connection is from a PooledConnection, the data layer has

// the option to retrieve this statement from its statement pool,

// saving the VM from re-compiling the statement again.

PreparedStatement cachedStatement = conn.prepareStatemet(INSERT_BOOK_QUERY);

// ...








在您的事務中使用 Savepoint
也許在 JDBC 3.0 中最令人興奮的附加特點就是 Savepoint 了。JDBC 2 中的事務支持讓開發(fā)人員可以控制對數(shù)據(jù)的并發(fā)訪問,從而保證持續(xù)數(shù)據(jù)總是保持一致的狀態(tài)。可惜的是,有時候需要的是對事務多一點的控制,而不是在當前的事務中簡單地對每一個改變進行回滾。在 JDBC 3.0 下,您就可以通過 Savepoint 獲得這種控制。Savepoint 接口答應您將事務分割為各個邏輯斷點,以控制有多少事務需要回滾。圖 1 將說明如何在事務中運用 Savepoint。

圖 1. Savepoint 的直觀表示


您或許不是經(jīng)常需要使用 Savepoint。然而,在一種普遍的情況下 Savepoint 會發(fā)揮作用,那就是您需要作一系列的改變,但是在知道所有的結果之前不能確定應該保留這些改變的哪一部分。清單 4 中的代碼示例說明了如何使用 Savepoint 接口。

清單 4. 使用 Savepoint


conn.setAutoCommit(false);

// Set a conservative transaction isolation level.

conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

Statement stmt = conn.createStatement();

int rows = stmt.executeUpdate( "INSERT INTO authors " +

′(first_name, last_name) VALUES " +

′(′Lewis′, ′Carroll′)");

// Set a named savepoint.

Savepoint svpt = conn.setSavepoint("NewAuthor");

// ...



rows = stmt.executeUpdate( "UPDATE authors set type = ′fiction′ " +

"WHERE last_name = ′Carroll′");

// ...

conn.rollback(svpt);

// ...

// The author has been added, but not updated.

conn.commit();








結論
JDBC 3.0 現(xiàn)在正在測試期中,官方發(fā)行定在 2001 年下半年。主要的數(shù)據(jù)庫廠商正在致力于提供 JDBC 3.0 的驅動程序,一些早期的測試版驅動程序已經(jīng)可以獲得。JDBC 3.0 的改變雖然在本質上不是革命性的,但也是一個非常重要的進步。通過在現(xiàn)有功能上的擴展,新的 JDBC 規(guī)范帶給您的是新的策略,以解決您的關系數(shù)據(jù)庫的問題。

參考資料

加入本文的討論論壇。


請閱讀 JDBC 規(guī)范或下載最新的 JDBC API。


請閱讀連接器體系結構規(guī)范。


請訪問 J2EE 主頁。


請訪問J2SE 1.4 測試版主頁。


John Zukowski 在他正在進行中的 DeveloperWorks 專欄, Merlin 的魔力中涉及了一些 Java 1.4 測試版中的精選的重要部分。


在六月份的 JavaOne 會議上,John Zukowski 參加了幾場 Java 1.4 測試版(Merlin)的報告,在 “Java 1.4,下一波”中闡述了 developerWorks 的重要部分。


IBM 紅皮書 “IBM WebSphere and VisualAge for Java Database Integration with DB2, Oracle, and SQL Server”描述了怎樣將關系數(shù)據(jù)庫系統(tǒng)與 Web 服務器集成。


Lotus 的 SQL/JDBC applet 是一個數(shù)據(jù)訪問 applet,可以讓您從外部數(shù)據(jù)庫那里閱讀、修改和發(fā)布數(shù)據(jù)。


Lennart J?elid 在 “Use JDBC for industrial-strength performance,第 1 部分”(developerWorks,2000 年 1 月)中,討論了通過 JDBC 來使用服務器端的 Java 模式。在 第 2 部分(developerWorks,2000 年 2 月),他描述了使用面向批量數(shù)據(jù)技術來得到多重 ResultSet 對象的方法。


請訪問 developerWorks Java 技術專區(qū),獲得更多的 Java 參考資料。


關于作者
Josh Heidebrecht 是一位 Sun 認證的 Java 2 平臺程序員,他在卡爾加里大學獲得計算機科學的學位。他目前是多倫多 IBM 軟件實驗室 VisualAge for Java 的開發(fā)小組成員。晚上他會學彈古典吉他而將鄰居嚇跑。可通過 jheidebr@ca.ibm.com 聯(lián)系 Josh。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 彰化县| 宣威市| 甘肃省| 克山县| 兴隆县| 岳西县| 大同市| 兴和县| 宝兴县| 咸宁市| 建瓯市| 陆川县| 清镇市| 高阳县| 牟定县| 屏东市| 同江市| 上林县| 正宁县| 恭城| 平山县| 车致| 湟中县| 阿坝县| 浦东新区| 天峻县| 湖北省| 弥勒县| 济宁市| 滦南县| 集安市| 南宁市| 乌鲁木齐市| 尤溪县| 盐津县| 五原县| 屏山县| 建昌县| 丹棱县| 阳原县| 阳原县|