亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

JDBC3.0有什么新特性

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

  概述 java 數據庫連接 3.0 規范的新功能和改進之處
Josh Heidebrecht(jheidebr@ca.ibm.com)
軟件工程師,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 還處在一種變化不定的情況下?,F在規范已經完成了,而且數據庫廠商已經采用了部分標準。所以自然地,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() 方法預備編寫一條語句時就這么做??杀3中钥梢允窍旅娉A恐械囊粋€。

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 的開發小組成員。晚上他會學彈古典吉他而將鄰居嚇跑??赏ㄟ^ jheidebr@ca.ibm.com 聯系 Josh。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久网站| 国产午夜精品美女视频明星a级| 亚洲一区二区三区视频播放| 亚洲欧美制服丝袜| 亚洲成年人在线播放| 欧美巨猛xxxx猛交黑人97人| 久久久久久亚洲精品中文字幕| 57pao国产成人免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 91色琪琪电影亚洲精品久久| 亚洲国产精品中文| 欧美不卡视频一区发布| 亚洲欧美一区二区精品久久久| 亚洲韩国欧洲国产日产av| 日韩成人中文字幕| 福利二区91精品bt7086| 欧美又大粗又爽又黄大片视频| 丝袜情趣国产精品| 日韩在线观看免费高清| 在线观看国产精品日韩av| 性欧美xxxx| 97色在线观看| 欧美成人精品在线观看| 国产精品第1页| 国产精品日韩欧美综合| 亚洲激情在线视频| 亚洲福利在线播放| 久久精品国产v日韩v亚洲| 亚洲自拍中文字幕| 亚洲精选一区二区| 日韩av不卡电影| 欧美中文字幕在线视频| www国产精品视频| 日韩欧美有码在线| 国内揄拍国内精品少妇国语| 最好看的2019的中文字幕视频| 精品高清美女精品国产区| 欧美日韩人人澡狠狠躁视频| 久久午夜a级毛片| 欧美黄网免费在线观看| 91国内揄拍国内精品对白| 国产亚洲精品久久久久动| 国产精品网红福利| 色吧影院999| 久久99精品视频一区97| 日韩在线观看免费全集电视剧网站| 亚洲国产精品资源| 国产一区二区三区欧美| 97久久久免费福利网址| 91国产高清在线| 日韩中文字幕亚洲| 亚洲精品成人av| 日韩欧美在线网址| 国产精品影院在线观看| 亚洲欧美日韩直播| 欧美日韩国产色| 亚洲天堂av综合网| 欧美日韩精品在线播放| 久久免费少妇高潮久久精品99| 亚洲香蕉成视频在线观看| 国产一区二区久久精品| 最新的欧美黄色| 国产精品网址在线| 欧美交受高潮1| 日韩欧中文字幕| 国产91ⅴ在线精品免费观看| 欧美日韩在线视频观看| 欧美黄色小视频| 成年人精品视频| 国产精彩精品视频| 欧美自拍视频在线观看| 色综合久久天天综线观看| 成人黄色免费片| 欧美日韩成人在线视频| 在线观看欧美成人| 精品国产户外野外| 91精品久久久久久久久不口人| 亚洲精品国产精品国产自| 成人伊人精品色xxxx视频| 亚洲国产成人精品女人久久久| 亚洲欧美国产精品| 日韩在线观看免费全| 欧美另类老肥妇| 日韩在线精品视频| 日本一区二区在线免费播放| 国产一区二区三区直播精品电影| 亚洲欧美日韩中文在线制服| 91夜夜未满十八勿入爽爽影院| 日韩国产高清视频在线| 高跟丝袜一区二区三区| 欧美精品18videos性欧美| 中文字幕日韩欧美在线视频| 好吊成人免视频| 91色视频在线观看| 亚洲视频在线观看视频| 精品视频一区在线视频| 欧美日韩中文字幕| 综合136福利视频在线| 亚洲精品视频在线观看视频| 日韩大陆毛片av| 欧美成人sm免费视频| 久久久久国产一区二区三区| 精品国产区一区二区三区在线观看| 国产午夜精品美女视频明星a级| 亚洲欧美制服中文字幕| 欧美大片在线看免费观看| 欧美野外wwwxxx| 欧美精品在线免费观看| 久久视频精品在线| 最近2019年中文视频免费在线观看| 日韩中文av在线| 5566成人精品视频免费| 欧美高跟鞋交xxxxhd| 亚洲性生活视频在线观看| 欧美精品久久久久a| 国产一区二区精品丝袜| 精品视频中文字幕| 亚洲精品国产综合区久久久久久久| 亚洲区免费影片| 一区二区福利视频| 青青草99啪国产免费| 精品国产成人av| 欧美日韩不卡合集视频| 伊人成人开心激情综合网| 亚洲美女视频网站| 亚洲天堂成人在线视频| 亚洲欧美国产精品| 久久久久久久一区二区| 色999日韩欧美国产| 午夜精品一区二区三区av| 亚洲成人激情图| 中文字幕日韩综合av| 色多多国产成人永久免费网站| 免费91在线视频| 九九九久久久久久| 国产大片精品免费永久看nba| 国产香蕉一区二区三区在线视频| 成人性生交xxxxx网站| 久久国产精品偷| 国产网站欧美日韩免费精品在线观看| 国产精品xxxxx| 欧美日产国产成人免费图片| 欧美亚洲国产日本| 日韩有码在线观看| 精品久久久久久久久久ntr影视| 77777少妇光屁股久久一区| 久久亚洲国产精品成人av秋霞| 久久久久久久成人| 欧美激情极品视频| 中文日韩在线观看| 欧美人与性动交a欧美精品| 日韩精品久久久久久久玫瑰园| 久久综合久久美利坚合众国| 黑人狂躁日本妞一区二区三区| 国产精品香蕉av| 精品久久久久久亚洲国产300| 一区二区三区在线播放欧美| 欧美激情一级二级| 亚洲社区在线观看| 91视频免费网站| 久久久国产一区| 国产亚洲精品高潮| 亚洲成人激情小说| 亚洲第一精品夜夜躁人人爽|