麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

JDBC3.0有什么新特性

2019-11-18 13:59:38
字體:
來源:轉載
供稿:網友

  概述 java 數據庫連接 3.0 規范的新功能和改進之處
Josh Heidebrecht([email protected]
軟件工程師,IBM

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

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

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

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

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

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

新功能摘要

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

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

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

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

增加的兩種新的數據類型是 java.sql.Types.DATALINK 和 java.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 中的示例創建一個新的作者并返回對應的自動產生的要害字。

清單 1. 檢索自動產生的要害字


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();

}








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

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

JDBC API 實現了連結器體系結構定義的三個協議中的兩個。第一個是將應用程序組件與后端系統相連接的連接治理,它是由 DataSource 和 ConnectionPoolDataSource 接口來實現的。第二個是支持對資源的事務性訪問的事務治理,它是由 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 對象將不會被關閉。

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

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

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

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

清單 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 中的事務支持讓開發人員可以控制對數據的并發訪問,從而保證持續數據總是保持一致的狀態。可惜的是,有時候需要的是對事務多一點的控制,而不是在當前的事務中簡單地對每一個改變進行回滾。在 JDBC 3.0 下,您就可以通過 Savepoint 獲得這種控制。Savepoint 接口答應您將事務分割為各個邏輯斷點,以控制有多少事務需要回滾。圖 1 將說明如何在事務中運用 Savepoint。

圖 1. Savepoint 的直觀表示


您或許不是經常需要使用 Savepoint。然而,在一種普遍的情況下 Savepoint 會發揮作用,那就是您需要作一系列的改變,但是在知道所有的結果之前不能確定應該保留這些改變的哪一部分。清單 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 現在正在測試期中,官方發行定在 2001 年下半年。主要的數據庫廠商正在致力于提供 JDBC 3.0 的驅動程序,一些早期的測試版驅動程序已經可以獲得。JDBC 3.0 的改變雖然在本質上不是革命性的,但也是一個非常重要的進步。通過在現有功能上的擴展,新的 JDBC 規范帶給您的是新的策略,以解決您的關系數據庫的問題。

參考資料

加入本文的討論論壇。


請閱讀 JDBC 規范或下載最新的 JDBC API。


請閱讀連接器體系結構規范。


請訪問 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”描述了怎樣將關系數據庫系統與 Web 服務器集成。


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


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


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


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品a一 | 黄色成年在线观看 | 免费亚洲视频在线观看 | 久久精品国产亚洲7777 | 国产免费www | av在线免费观看网址 | 国产精品久久久久av | 欧美性生交xxxxx免费观看 | 美国一级黄色毛片 | 欧产日产国产精品乱噜噜 | 国产一级毛片国产 | 黄色毛片视频在线观看 | 久啪视频 | 毛片一级网站 | 日本欧美一区二区三区在线播 | 黄色特级片黄色特级片 | 久草成人在线 | 国产免费观看视频 | 一级一级一级一级毛片 | 国产一国产精品一级毛片 | 爱爱视频天天干 | 国产在线一级片 | 粉嫩粉嫩一区二区三区在线播放 | 国产免费成人在线 | 成人免费自拍视频 | 日韩色视频在线观看 | 久久不射电影 | videos高潮 | 好吊色欧美一区二区三区四区 | 在线播放91 | 亚洲成人伊人 | 欧美视频一区二区三区在线观看 | 午夜精品久久久久久久99热浪潮 | 99精品国产成人一区二区 | 精品一区二区三区免费毛片爱 | 久久精品re | 精品国产一区二区在线 | 一级成人欧美一区在线观看 | 鲁久久 | 成人午夜免费网站 | 日韩电影av在线 |