JDBC簡介
JDBC是Java語言訪問數據庫的一種規範,一套規範的API接口。基於這些規範的接口和類,java程序員
可以訪問不同類型的數據庫,執行SQL語句進行數據庫操作。
閱讀JDK源碼可以知道JDBC的操作都是基於java.sql(j2se)、javax.sql(J2EE)包中,都是一些接口類。
其類圖大致如下:
由於市面上有着各種不同的數據庫,JDBC規範採用了接口和實現分離的設計思想。各個數據庫廠商根據
JDBC的規範實現自己的數據庫驅動程序jar包。
這樣程序員在數據庫編程時通過統一的接口操作數據庫更加靈活、方便。
JDBC驅動程序
JDBC驅動程序就是數據庫廠商根據JDBC規範實現的JDBC實現類。JDBC驅動程序
有四種類型:
● 第一種類型的驅動程序是通過將JDBC的調用委託給其他編程接口來實現的,例如
ODBC。這種類型的驅動程序依賴於本地程序,便攜性差。例如JDBC-ODBC橋接。
● 第二種類型的驅動程序部分基於java語言實現,驅動程序一部分的操作交由java實現,
其他部分委託給本地程序。便攜性低。
● 第三種類型的驅動程序全部由java語言實現,該類型的驅動程序一般有某個中間件服務
器提供,這樣客戶端程序可以使用數據庫無關的協議和中間件服務器進行通訊,中間
件服務器在將客戶端的JDBC調用轉發給數據庫進行處理。連接池方式(JNDI)
● 第四種方式的驅動程序由Java實現,該類型的數據庫包含了特定的數據庫訪問協議,
使得客戶端可以和數據庫直接進行通訊。JDBC直連方式。
對於數據庫的連接現大多采用3、4兩種方式,至於這兩種方式優缺點,可以參考一下文章:
JDNI: http://blog.csdn.net/kiritor/article/details/8960942
文章中簡要的介紹了JDNI連接池,值得一提的是連接池的方式對於併發訪問下數據庫連接
的管理更加方便合理。這裏就不多提了,讀者可自行查閱資料。
JDBC連接數據庫步驟:
1、註冊數據庫驅動程序
2、得到數據庫連接
3、執行SQL語句
4、處理結果集
5、關閉資源
其時序圖情況如下:
對於JDBC編程中的具體操作這裏就不在給出解釋以及給出代碼了。在簡要的介紹了下JDBC
之後讀者較爲感興趣的是JDBC對事務隔離的操作。
JDBC事務隔離
現如今的DBMS基本都支持事務處理,用來管理兩個或多個事務同時對一個數據庫進行操作時產生的
衝突。而且用戶能夠制定指定事物的隔離級別,DBMS進而根據用戶指定的級別花費相應的"精力"來解決衝突。
我們知道在數據庫併發訪問的時候會帶來一下三個問題:
★ 不可重複讀:一次事務中讀取同一個變量兩次,但是由於另一事務的干預兩次讀取的值不一樣。
★ 髒讀:一次事務對數據進行了修改尚未提交,同時另一個事務也訪問這個數據並使用了它
★ 幻讀(影像讀取):幻讀師數據更新被覆蓋或丟失,事務A、B同時對c值進行修改,若A先提交
,則事務A的更新由於被B覆蓋而更改。
針對併發執行所產生的以上三種數據不一致的情況,JDBC提供了5中不同的事務隔離級別來解決
上述衝突問題。有些情況下我們對併發執行的數據要求並不高,一種情況就是我們允許幻讀,卻不允許不可
重 復讀和髒讀。
隔離級別的設置在於使DBMS使用最小的"精力"解決我們能夠接受的數據不一致問題。也就是尋求
性能與數據一致性的平衡點。
目前常用數據庫的JDBC實現對數據隔離級別的支持如下:
事務的隔離性越高,爲避免事務衝突所花費的代價就也高。如圖可以知道JDBC通過Connection接口定
義了5級隔離級別。在決定採用什麼隔離級別之前,開發人員應該就性能和數據一致性需求之間進行權衡。
而且JDBC實際所能支持的隔離級別取決於DBMS的功能。
在JDBC編程中,用戶可以通過創建的Connection對象使用
conn.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)手動的更改隔離級別。新的
隔離級別將在該連接的剩餘時間內生效。需要注意的是不要在事務的中途去修改隔離級別這會導致
事務立即提交。