欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
概述 java 數據庫連接 3.0 規范的新功能和改進(jìn)之處
概述 Java 數據庫連接 3.0 規范的新功能和改進(jìn)之處
Josh Heidebrecht
軟件工程師, IBM
2001 年 7 月 04 日
Java 數據庫連接(Java Database Connectivity,JDBC)API 是作為 Java 2 標準版(Java 2 Standard Edition,J2SE)和 Java 2 企業(yè)版(Java 2 Enterprise Edition,J2EE)平臺的一個(gè)關(guān)鍵部分出現的。它是一種主要的基于標準的機制,能讓 Java 語(yǔ)言通過(guò)編程來(lái)訪(fǎng)問(wèn)關(guān)系數據庫,所以當 Java Community Process 發(fā)布一份新版本的規范時(shí),開(kāi)發(fā)人員一定會(huì )感興趣。在此,我們就 Sun Microsystems 最近發(fā)布的 JDBC 規范的提議最終草案(Proposed Final Draft)3.0 版本來(lái)總結一下它的一些新的主要功能。加入討論論壇,與作者和其他讀者分享您對本文的看法。
Java 數據庫連接(JDBC)3.0 規范建立在其原本穩固的基礎上,增加了幾個(gè)新功能以彌補原來(lái)功能不足的地方。無(wú)論是 java.sql 還是第一次出現的 javax.sql 軟件包,都會(huì )包含在還處于測試階段的 Java 1.4 版平臺中。在今年晚些時(shí)候它就會(huì )被正式發(fā)布,到時(shí) Java 開(kāi)發(fā)人員就能夠利用這些改進(jìn)了,所以現在正是開(kāi)始了解這些改變的好時(shí)候。
我們會(huì )簡(jiǎn)單地討論一下 JDBC 的設計師們?yōu)檫@個(gè)版本所考慮到的幾個(gè)設計目標。理解了設計師們的設計基本原理,我們就可以更好地去理解那些改變。我們會(huì )總結一下規范中的幾個(gè)新功能以便了解整個(gè) API 是怎樣被改變的。另外,我們還會(huì )深入研究幾個(gè)最適用于應用程序開(kāi)發(fā)人員的關(guān)鍵功能,以成功地協(xié)助您利用其新性能。
設計 JDBC 3.0 規范的初衷主要是讓原先的 JDBC 規范下的功能更加完美。因此,這個(gè)新規范的設計指導原則之一就是要與現存的應用程序和驅動(dòng)程序保持兼容性。所以,JDBC 2 的用戶(hù)可以放心,他們的應用程序能在 JDBC 3.0 下正確運行。另外,使用以前那些遭反對的方法寫(xiě)進(jìn) JDBC 1 API 的代碼也可以繼續運行。
隨著(zhù) J2EE 平臺迅速的日益流行,設計師們也想增強 JDBC 的可伸縮性。新增的語(yǔ)句池和增強的連接池支持離實(shí)現這個(gè)目標還很遠。此外,設計師們還仔細地考慮 JDBC 與新的連接器體系結構之間的關(guān)系,來(lái)繼續提高服務(wù)器上的 Java 技術(shù)。
在 JDBC 2 開(kāi)發(fā)的過(guò)程中,SQL99 還處在一種變化不定的情況下?,F在規范已經(jīng)完成了,而且數據庫廠(chǎng)商已經(jīng)采用了部分標準。所以自然地,JDBC 規范就跟著(zhù)將自己與 SQL99 功能的一部分相統一。最新的 JDBC 規范已經(jīng)采用了 SQL99 標準中那些已經(jīng)被廣泛支持的功能,還有那些在五年內可能會(huì )獲得支持的功能。
如果一個(gè)數據庫還不支持 JDBC 3.0 所支持的部分 SQL99 功能,驅動(dòng)程序可以使用元數據 API 向應用程序開(kāi)發(fā)人員表明:其底層數據庫不支持一部分 JDBC 功能。這一點(diǎn)允許數據庫廠(chǎng)商生產(chǎn)出相應的 JDBC 驅動(dòng)程序,盡管他們可能不支持所有的功能。增加的兩種新的數據類(lèi)型以及對事務(wù)的 Savepoint 的支持說(shuō)明了兩個(gè)和 SQL99 有關(guān)的改變。
元數據 API 已經(jīng)得到更新, DatabaseMetaData 接口現在可以檢索 SQL 類(lèi)型的層次結構,一種新的 ParameterMetaData 接口可以描述 PreparedStatement 對象中參數的類(lèi)型和屬性。
在 JDBC 3.0 之前,設置一個(gè)存儲過(guò)程中的一個(gè)參數要指定它的索引值,而不是它的名稱(chēng)。 CallableStatement 接口已經(jīng)被更新了,現在您可以用名稱(chēng)來(lái)指定參數。
JDBC 所支持的數據類(lèi)型作了幾個(gè)改變,其中之一是增加了兩種新的數據類(lèi)型。
為了便于修改 CLOB(Character Large OBject,字符型巨對象)、BLOB(Binary Large OBject,二進(jìn)制巨對象)和 REF(SQL 結構)類(lèi)型的值,同名的數據類(lèi)型接口都被更新了。接下來(lái)的是,因為我們現在能夠更新這些數據類(lèi)型的值,所以 ResultSet 接口也被修改了,以支持對這些數據類(lèi)型的列的更新,也包括對 ARRAY 類(lèi)型的更新。
增加的兩種新的數據類(lèi)型是 java.sql.Types.DATALINK 和 java.sql.Types.BOOLEAN 。新增的數據類(lèi)型指的是同名的 SQL 類(lèi)型。DATALINK 提供對外部資源的訪(fǎng)問(wèn)或 URL,而 BOOLEAN 類(lèi)型在邏輯上和 BIT 類(lèi)型是等同的,只是增加了在語(yǔ)義上的含義。DATALINK 列值是通過(guò)使用新的 getURL() 方法從 ResultSet 的一個(gè)實(shí)例中檢索到的,而 BOOLEAN 類(lèi)型是通過(guò)使用 getBoolean() 來(lái)檢索的。
為了解決對獲取自動(dòng)產(chǎn)生的或自動(dòng)增加的關(guān)鍵字的值的需求,JDBC 3.0 API 現在將獲取這種值變得很輕松。要確定任何所產(chǎn)生的關(guān)鍵字的值,只要簡(jiǎn)單地在語(yǔ)句的 execute() 方法中指定一個(gè)可選的標記,表示您有興趣獲取產(chǎn)生的值。您感興趣的程度可以是 Statement.RETURN_GENERATED_KEYS ,也可以是 Statement.NO_GENERATED_KEYS 。在執行這條語(yǔ)句后,所產(chǎn)生的關(guān)鍵字的值就會(huì )通過(guò)從 Statement 的實(shí)例方法 getGeneratedKeys() 來(lái)檢索 ResultSet 而獲得。 ResultSet 包含了每個(gè)所產(chǎn)生的關(guān)鍵字的列。清單 1 中的示例創(chuàng )建一個(gè)新的作者并返回對應的自動(dòng)產(chǎn)生的關(guā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();}
大多數應用程序開(kāi)發(fā)人員不需要知道 JDBC 和 J2EE 連結器體系結構之間的關(guān)系,就可以很好地使用 JDBC API。但是,由于 JDBC 3.0 規范已經(jīng)考慮到這項新的體系結構,這使得開(kāi)發(fā)人員能更好地理解 JDBC 在哪里適合 J2EE 標準,以及這個(gè)規范的發(fā)展方向是什么。
J2EE 連結器體系結構指定了一組協(xié)議,允許企業(yè)的信息系統以一種可插入的方式連接到應用服務(wù)器上。這種體系結構定義了負責與外部系統連接的資源適配器。連接器服務(wù)提供者接口(The Connectors Service Provider Interface,SPI)恰好和 JDBC 接口提供的服務(wù)緊密配合。
JDBC API 實(shí)現了連結器體系結構定義的三個(gè)協(xié)議中的兩個(gè)。第一個(gè)是將應用程序組件與后端系統相連接的連接管理,它是由 DataSource 和 ConnectionPoolDataSource 接口來(lái)實(shí)現的。第二個(gè)是支持對資源的事務(wù)性訪(fǎng)問(wèn)的事務(wù)管理,它是由 XADataSource 來(lái)處理的。第三個(gè)是支持后端系統的安全訪(fǎng)問(wèn)的安全性管理,在這點(diǎn)上,JDBC 規范并沒(méi)有任何對應點(diǎn)。盡管有最后那個(gè)不足,JDBC 接口仍能映射到連接器 SPI 上。如果一個(gè)驅動(dòng)程序廠(chǎng)商將其 JDBC 驅動(dòng)程序映射到連接器系統協(xié)議上,它就可以將其驅動(dòng)程序部署為資源適配器,并立刻享受可插性、封裝和在應用服務(wù)器中部署的好處。這樣,一個(gè)標準的 API 就可以在不同種類(lèi)的的企業(yè)信息系統中,供企業(yè)開(kāi)發(fā)人員使用。
一個(gè)可保持的游標(或結果),就是說(shuō)該游標在包含它的事務(wù)被提交后,也不會(huì )自動(dòng)地關(guān)閉。JDBC 3.0 增加了對指定游標可保持性的支持。要制定您 ResultSet 的可保持性,您必須在使用 createStatement() 、 prepareStatement() 或 prepareCall() 方法準備編寫(xiě)一條語(yǔ)句時(shí)就這么做??杀3中钥梢允窍旅娉A恐械囊粋€(gè)。
HOLD_CURSORS_OVER_COMMIT ResultSet 對象(游標)沒(méi)有被關(guān)閉;它們在提交操作得到顯式的或隱式的執行以后仍保持打開(kāi)的狀態(tài)。
CLOSE_CURSORS_AT_COMMIT ResultSet 對象(游標)在提交操作得到顯式的或隱式的執行后被關(guān)閉。
總的來(lái)說(shuō),在事務(wù)提交之后關(guān)閉游標操作會(huì )帶來(lái)更好的性能。除非您在事務(wù)結束后還需要該游標,否則您最好在執行提交操作后將其關(guān)閉。因為規范沒(méi)有規定 ResultSet 的缺省的可保持性,所以具體行為還將取決于執行情況。然而,我希望在可以使用 JDBC 3.0 驅動(dòng)程序時(shí),大多數執行在事務(wù)結束后仍舊會(huì )關(guān)閉游標。
JDBC 2 規范的一個(gè)局限是,在任意時(shí)刻,返回多重結果的語(yǔ)句只能打開(kāi)一個(gè) ResultSet 。作為 JDBC 3.0 規范中改變的一個(gè)部分,規范將允許 Statement 接口支持多重打開(kāi)的 ResultSets 。然而,重要的是 execute() 方法仍然會(huì )關(guān)閉任何以前 execute() 調用中打開(kāi)的 ResultSet 。所以,要支持多重打開(kāi)的結果, Statement 接口就要加上一個(gè)重載的 getMoreResults() 方法。新式的方法會(huì )做一個(gè)整數標記,在 getResultSet() 方法被調用時(shí)指定前一次打開(kāi)的 ResultSet 的行為。接口將按如下所示定義標記:
CLOSE_ALL_RESULTS 當調用 getMoreResults() 時(shí),所有以前打開(kāi)的 ResultSet 對象都將被關(guān)閉。
CLOSE_CURRENT_RESULT 當調用 getMoreResults() 時(shí),當前的 ResultSet 對象將被關(guān)閉。
KEEP_CURRENT_RESULT 當調用 getMoreResults() 時(shí),當前的 ResultSet 對象將不會(huì )被關(guān)閉。
清單 2 展示的是一個(gè)處理多重打開(kāi)結果的示例。
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 定義了幾個(gè)標準的連接池屬性。開(kāi)發(fā)人員并不需要直接地用 API 去修改這些屬性,而是通過(guò)應用服務(wù)器或數據存儲設備來(lái)實(shí)現。由于開(kāi)發(fā)人員只會(huì )間接地被連接池屬性的標準化所影響,所以有利之處并不明顯。然而,通過(guò)減少廠(chǎng)商特定設置的屬性的數量并用標準化的屬性來(lái)代替它們,開(kāi)發(fā)人員能更容易地在不同廠(chǎng)商的 JDBC 驅動(dòng)程序之間進(jìn)行交換。另外,這些屬性還允許管理員很好地優(yōu)化連接池,從而使應用程序的性能特點(diǎn)發(fā)揮到極致。這些屬性如下表所示。
屬性名稱(chēng) 描述
maxStatements 連接池可以保持打開(kāi)的語(yǔ)句數目。
initialPoolSize 當池初始化時(shí)可以建立的物理連接的數目。
minPoolSize 池可以包含的物理連接的最小數目。
maxPoolSize 池可以包含的物理連接的最大數目。零指沒(méi)有最大值。
maxIdleTime 持續時(shí)間,以秒計,指一個(gè)閑置的物理連接在被關(guān)閉前可以在池中停留的時(shí)間。零指沒(méi)有限制。
propertyCycle 間隔時(shí)間,以秒計,指連接池在執行其屬性策略前可以等待的時(shí)間。
除了改進(jìn)對連接池的支持以外,現在也能緩沖預備語(yǔ)句了。預備語(yǔ)句允許您用一條常用的 SQL 語(yǔ)句然后預編譯它,從而在這條語(yǔ)句被多次執行的情況下大幅度地提升性能。在另一個(gè)方面,建立一個(gè) PreparedStatement 對象會(huì )帶來(lái)一定量的系統開(kāi)銷(xiāo)。所以,在理想情況下,這條語(yǔ)句的生命周期應該足夠長(cháng),以補償它所帶來(lái)的系統開(kāi)銷(xiāo)。追求性能的開(kāi)發(fā)人員有時(shí)候為了延長(cháng) PreparedStatement 對象的生命周期會(huì )不惜扭曲他們的對象模型。JDBC 3.0 讓開(kāi)發(fā)人員不再為此擔心,因為數據源層現在負責為預備語(yǔ)句進(jìn)行緩存。
清單 3 將示范如何利用 JDBC 對預備語(yǔ)句池的支持。細心的讀者可能會(huì )發(fā)現清單中的語(yǔ)句和普通 JDBC 2 的代碼沒(méi)什么兩樣。這是因為語(yǔ)句的緩沖是完全在內部實(shí)現的。這就意味著(zhù),在 JDBC 3.0 下,您現存的代碼可以自動(dòng)利用語(yǔ)句池。但可惜的是,這也意味著(zhù)您將不能控制哪個(gè)預備語(yǔ)句將被緩沖,而只能控制被緩存的語(yǔ)句的數目。
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);// ...
也許在 JDBC 3.0 中最令人興奮的附加特點(diǎn)就是 Savepoint 了。JDBC 2 中的事務(wù)支持讓開(kāi)發(fā)人員可以控制對數據的并發(fā)訪(fǎng)問(wèn),從而保證持續數據總是保持一致的狀態(tài)??上У氖?,有時(shí)候需要的是對事務(wù)多一點(diǎn)的控制,而不是在當前的事務(wù)中簡(jiǎn)單地對每一個(gè)改變進(jìn)行回滾。在 JDBC 3.0 下,您就可以通過(guò) Savepoint 獲得這種控制。 Savepoint 接口允許您將事務(wù)分割為各個(gè)邏輯斷點(diǎn),以控制有多少事務(wù)需要回滾。圖 1 將說(shuō)明如何在事務(wù)中運用 Savepoint。
您或許不是經(jīng)常需要使用 Savepoint。然而,在一種普遍的情況下 Savepoint 會(huì )發(fā)揮作用,那就是您需要作一系列的改變,但是在知道所有的結果之前不能確定應該保留這些改變的哪一部分。清單 4 中的代碼示例說(shuō)明了如何使用 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 現在正在測試期中,官方發(fā)行定在 2001 年下半年。主要的數據庫廠(chǎng)商正在致力于提供 JDBC 3.0 的驅動(dòng)程序,一些早期的測試版驅動(dòng)程序已經(jīng)可以獲得。JDBC 3.0 的改變雖然在本質(zhì)上不是革命性的,但也是一個(gè)非常重要的進(jìn)步。通過(guò)在現有功能上的擴展,新的 JDBC 規范帶給您的是新的策略,以解決您的關(guān)系數據庫的問(wèn)題。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
通過(guò)JDBC進(jìn)行簡(jiǎn)單的增刪改查(以MySQL為例)
Oracle JDBC中的語(yǔ)句緩存
JDBC <Java Database Connectivity>解釋:
Java中的事務(wù)
JDBC介紹
歡迎光臨 - 琳婕小筑-老貓的理想 - 通過(guò)JDBC操作ORACLE數據庫實(shí)例詳解 -
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久