JDBCTM 指南:入門2 - 連線 (轉)

worldblog發表於2008-03-25
JDBCTM 指南:入門2 - 連線 (轉)[@more@]內容: 2 - 連線本概述是從《JCTM Database Access from TM: A Tutorial
and Annotated Reference 》這本書中摘引來的。JavaSoft 目前正在準備這本書。這本書是一本教程,同時也是 的重要參考
手冊,它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。2.1 概述
Connection 代表與的連線。連線過程包括所的 語句和在該連線上所返回的結果。一個應用可與單個資料庫有
一個或多個連線,或者可與許多資料庫有連線。2.1.1 開啟連線與資料庫建立連線的標準方法是 Manager.getConnection
方法。該方法接受含有某個 URL 的字串。DriverManager 類(即所謂的 JDBC 管理層)將嘗試找到可與那個 URL 所代表的資料庫進
行連線的程式。DriverManager 類存有已註冊的 Driver 類的清單。當呼叫方法 getConnection 時,它將檢查清單中的每個驅動程
序,直到找到可與 URL 中指定的資料庫進行連線的驅動程式為止。Driver 的方法 connect 使用這個 URL 來建立實際的連線。
可繞過 JDBC 管理層直接呼叫 Driver 方法。這在以下特殊情況下將很有用:當兩個驅動器可同時連線到資料庫中,而使用者需要明確
地選用其中特定的驅動器。但一般情況下,讓 DriverManager 類處理開啟連線這種事將更為簡單。
下述程式碼顯示如何開啟一個與位於 URL "jdbc:odbc:wombat" 的資料庫的連線。所用的使用者識別符號為 "oboy" ,口令為 "12Java":
String url = "jdbc:odbc:wombat";
Connection con = DriverManager.getConnection(url, "oboy", "12Java");
2.1.2 一般用法的 URL由於 URL 常引起混淆,我們將先對一般 URL 作簡單說明,然後再討論 JDBC URL。
URL(統一資源定位符)提供在 Inte 上定位資源所需的資訊。可將它想象為一個地址。
URL 的第一部份指定了訪問資訊所用的,後面總是跟著冒號。常用的協議有 ""(代表“傳輸協議”)和 "http" (代表“超文字傳輸協議”)。
如果協議是 "file",表示資源是在某個本地檔案上而非在 Internet 上(下例用於表示我們所描述的部分;它並非 URL 的組成部分)。
ftp://javasoft.com/docs/-1_docs.zip

file:/home/haroldw/docs/books/tutorial/summary.html
URL 的其餘部份(冒號後面的)給出了資料資源所處位置的有關資訊。如果協議是 file,則 URL 的其餘部份是檔案的路徑。對於 ftp 和
http 協議,URL 的其餘部份標識了主機並可選地給出某個更詳盡的地址路徑。例如,以下是 JavaSoft 主頁的 URL。該 URL 只標識了主機:
從該主頁開始瀏覽,就可以進到許多其它的網頁中,其中之一就是
JDBC 主頁。JDBC 主頁的 URL 更為具體,它看起來類似: /products/jdbc
2.1.3 JDBC URL JDBC URL 提供了一種標識資料庫的方法,可以使相應的驅動程式能識別該資料庫並與之建立連線。實際上,驅動程式設計師
將決定用什麼 JDBC URL 來標識特定的驅動程式。使用者不必關心如何來形成 JDBC URL;他們只須使用與所用的驅動程式一起提供的 URL 即
可。JDBC 的作用是提供某些約定,驅動程式程式設計員在構造他們的 JDBC URL 時應該遵循這些約定。
由於 JDBC URL 要與各種不同的驅動程式一起使用,因此這些約定應非常靈活。首先,它們應允許不同的驅動程式使用不同的方案來命名
資料庫。例如, odbc 子協議允許(但並不是要求) URL 含有屬性值。第二,JDBC URL 應允許驅動程式程式設計員將一切所需的資訊編入其中。這
樣就可以讓要與給定資料庫對話的 applet 開啟資料庫連線,而無須要求使用者去做任何工作。
第三, JDBC URL 應允許某種程度的間接性。也就是說,JDBC URL 可指向邏輯主機或資料庫名,而這種邏輯主機或資料庫名將由命
名系統動態地轉換為實際的名稱。這可以使系統管理員不必將特定主機宣告為 JDBC 名稱的一部份。網路命名服務(例如 、 NIS 和
DCE )有多種,而對於使用哪種命名服務並無限制。JDBC URL 的標準語法如下所示。它由三部分組成,各部分間用冒號分隔:
jdbc:< 子協議 >:< 子名稱 >JDBC URL 的三個部分可分解如下: jdbc ─ 協議。JDBC URL 中的協議總是 jdbc。
─ 驅動程式名或資料庫連線機制(這種機制可由一個或多個驅動程式支援)的名稱。子協議名的典型示例是 "odbc",該名稱
是為用於指定 ODBC 風格的資料資源名稱的 URL 專門保留的。例如,為了透過 JDBC-ODBC 橋來訪問某個資料庫,可以用如下所示的 URL:
jdbc:odbc:fred本例中,子協議為 "odbc",子名稱 "fred" 是本地ODBC 資料資源。
如果要用網路命名服務(這樣 JDBC URL 中的資料庫名稱不必是實際名稱),則命名服務可以作為子協議。例如,可用如下所示的 URL :
jdbc:dcenaming:accounts-payable本例中,該 URL 指定了本地 DCE 命名服務應該將
資料庫名稱 "accounts-payable" 解析為更為具體的可用於連線真實資料庫的名稱。 ─ 一種標識資料庫的方法。子名稱可以依不同的子協議而
變化。它還可以有子名稱的子名稱(含有驅動程式程式設計員所選的任何內部語法)。使用子名稱的目的是為定位資料庫提供足夠的資訊。前
例中,因為 ODBC 將提供其餘部份的資訊,因此用 "fred" 就已足夠。然而,位於上的資料庫需要更多的資訊。例如,如果資料
庫是透過 Internet 來訪問的,則在 JDBC URL 中應將網路地址作為子名稱的一部份包括進去,且必須遵循如下所示的標準 URL 命名約定:
//主機名:埠/子協議假設 "dbnet" 是個用於將某個主機連線到 Internet 上的協議,則 JDBC URL 類似:
jdbc:dbnet://wombat:356/fred 2.1.4 "odbc" 子協議
子協議 odbc 是一種特殊情況。它是為用於指定 ODBC 風格的資料資源名稱的 URL 而保留的,並具有下列特性:允許在子名稱(資料資
源名稱)後面指定任意多個屬性值。odbc 子協議的完整語法為: jdbc:odbc:< 資料資源名稱 >[;< 屬性名 >=< 屬性值 >]*
因此,以下都是合法的 jdbc:odbc 名稱: jdbc:odbc:qeor7jdbc:odbc:wombat
jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
jdbc:odbc:qeora;UID=kgh;PWD=fooey2.1.5 註冊子協議驅動程式程式設計員可保留某個名稱以將之用作 JDBC URL 的子協議名。
當 DriverManager 類將此名稱加到已註冊的驅動程式清單中時,為之保留該名稱的驅動程式應能識別該名稱並與它所標識的資料庫建立連
接。例如,odbc 是為 JDBC- ODBC 橋而保留的。示例之二,假設有
個 Miracle 公司,它可能會將 "miracle" 註冊為連線到其 Miracle DBMS 上的 JDBC 驅動程式的子協議,從而使其他人都無法使用這個
名稱。JavaSoft 目前作為非正式負責註冊 JDBC 子協議名稱。要註冊某個子協議名稱,請傳送電子到下述地址:
jdbc@wombat.eng.sun.com2.1.6 傳送 SQL 語句連線一旦建立,就可用來向它所涉及的資料庫傳送 SQL 語句。JDBC
對可被髮送的 SQL 語句型別不加任何限制。這就提供了很大的靈活性,即允許使用特定的資料庫語句或甚至於非 SQL 語句。然而,它要
求使用者自己負責確保所涉及的資料庫可以處理所傳送的 SQL 語句,否則將自食其果。例如,如果某個應用程式試圖向不支援儲存程式的
DBMS 傳送儲存程式呼叫,就會失敗並將丟擲異常。JDBC 要求驅動程式應至少能提供 ANSI SQL-2 Entry Level 功能才可算是符合 JDBC
標準TM 的。這意味著使用者至少可信賴這一標準級別的功能。JDBC 提供了三個類,用於向資料庫傳送 SQL 語句。Connection 介面
中的三個方法可用於建立這些類的例項。下面列出這些類及其建立方法:
Statement ─ 由方法 createStatement 所建立。Statement 物件用於傳送簡單的 SQL 語句。
PreparedStatement ─ 由方法 prepareStatement 所建立。
PreparedStatement 物件用於傳送帶有一個或多個輸入引數( IN 引數)
的 SQL 語句。PreparedStatement 擁有一組方法,用於設定 IN 引數的值。
執行語句時,這些 IN 引數將被送到資料庫中。PreparedStatement 的實
例擴充套件了 Statement ,因此它們都包括了 Statement 的方法。
PreparedStatement 物件有可能比 Statement 物件的更高,因為它已被預編譯過並存放在那以供將來使用。
CallableStatement ─ 由方法 prepareCall 所建立。CallableStatement 物件
用於執行 SQL 儲存程式 ─ 一組可透過名稱來呼叫(就象的呼叫那樣)的
SQL 語句。CallableStatement 物件從 PreparedStatement 中繼承了用於
處理 IN 引數的方法,而且還增加了用於處理 OUT 引數和 INOUT 引數的方法。
以下所列提供的方法可以決定應用哪個 Connection 方法來建立不同型別的 SQL 語句: createStatement 方法用於:
簡單的 SQL 語句(不帶引數) prepareStatement 方法用於: 帶一個或多個 IN 引數的 SQL 語句 經常被執行的簡單 SQL 語句
prepareCall 方法用於: 呼叫已儲存過程2.1.7 事務事務由一個或多個這樣的語句組成:這些語句已被執行、完成並被
提交或還原。當呼叫方法 commit 或 rollback 時,當前事務即告就結束,另一個事務隨即開始。
預設情況下,新連線將處於自動提交。也就是說,當執行完語句後,將自動對那個語句呼叫 commit 方法。這種情況下,由於每個語
句都是被單獨提交的,因此一個事務只由一個語句組成。如果禁用自動提交模式,事務將要等到 commit 或 rollback 方法被顯式呼叫時
才結束,因此它將包括上一次呼叫 commit 或 rollback 方法以來所有執行過的語句。對於第二種情況,事務中的所有語句將作為組來提交或還原。
方法 commit 使 SQL 語句對資料庫所做的任何更改成為永久性的,它還將釋放事務持有的全部鎖。而方法 rollback 將棄去那些更改。
有時使用者在另一個更改生效前不想讓此更改生效。這可透過禁用自動提交併將兩個組合在一個事務中來達到。如果兩個更新都是成功
,則呼叫 commit 方法,從而使兩個更新結果成為永久性的;如果其中之一或兩個更新都失敗了,則呼叫 rollback 方法,以將值恢復為進行更新之前的值。
大多數 JDBC 驅動程式都支援事務。事實上,符合 JDBC 的驅動程式必須支援事務。DatabaseMetaData 給出的資訊描述 DBMS 所提供的
事務支援水平。2.1.8 事務隔離級別如果 DBMS 支援事務處理,它必須有某種途徑來管理兩個事務同時對
一個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明 DBMS 應該花多大精力來解決潛在衝突。例如,當事務更改了
某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦 假設第一個事務被還原後,第二個事務所讀取的更改值將是無效的,
那麼是否可允許這種衝突? JDBC 使用者可用以下程式碼來指示 DBMS 允許在值被提交前讀取該值(“dirty 讀取”),其中 con 是當前連線:
con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);
事務隔離級別越高,為避免衝突所花的精力也就越多。Connection 介面定義了五級,其中最低階別指定了根本就不支援事務,而最高階
別則指定當事務在對某個資料庫進行操作時,任何其它事務不得對那個事務正在讀取的資料進行任何更改。通常,隔離級別越高,應用程
序執行的速度也就越慢(由於用於鎖定的資源耗費增加了,而使用者間的併發操作減少了)。在決定採用什麼隔離級別時,開發人員必須
在需求和資料一致性需求之間進行權衡。當然,實際所能支援的級別取決於所涉及的 DBMS 的功能。
當建立 Connection 物件時,其事務隔離級別取決於驅動程式,但通常是所涉及的資料庫的預設值。使用者可透過呼叫 setIsolationLevel
方法來更改事務隔離級別。新的級別將在該連線過程的剩餘時間內生效。要想只改變一個事務的事務隔離級別,必須在該事務開始前進
行設定,並在該事務結束後進行復位。我們不提倡在事務的中途對事務隔離級別進行更改,因為這將立即觸發 commit 方法的呼叫,使在
此之前所作的任何更改變成永久性的。

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

相關文章