筆記:JDBC(二)——批處理/事務/鏈接池

1、批處理html

    概念:將向數據庫表一次性插入多條記錄,而不是一條一條插入的方式,這樣能夠提供效率。java

    實現方法:sql

                executeBatch():向MySQL數據庫發送一批SQL語句
                addBatch():將當前SQL語句添加到Statement對象中
                clearBatch():釋放Statement對象中的SQL語句
  • Statement批處理,該類提供以下方法用於批處理操做。

方法摘要數據庫

voidapache

addBatch(String sql)
將給定的 SQL 命令添加到此 Statement 對象的當前命令列表中。編程

void數組

clearBatch()
清空此 Statement 對象的當前 SQL 命令列表。tomcat

int[]服務器

executeBatch()
將一批命令提交給數據庫來執行,若是所有命令執行成功,則返回更新計數組成的數組。多線程

 
  • PreparedStatement批處理,該類提供以下方法用於批處理操做。

方法摘要

void

addBatch()
將一組參數添加到此 PreparedStatement 對象的批處理命令中。

 
2、事務
    定義:訪問並可能更新數據庫中各類數據項的一個程序執行單元。
 
     四大特色(簡稱ACID):
      原子性(Atomicity):一個事務不可分割的工做單位,事務中包括的諸操做要麼都執行(成功),要麼都不執行(失敗)。
      一致性(Consistent):事務必須是使數據庫從一個一致性狀態變到另外一個一致性狀態,一致性與原子性是密切相關的。
      隔離性(Isolation):一個事務執行不能被其餘事務干擾。
      持久性(Durability):持久性也稱爲永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
 
 
3、MySQL事務
    概念: MySQL對事物的管理,在默認狀況下,MySQL每執行一條SQL語句,就會將這條SQL語句視爲一個單獨的事物。若是在多條SQL語句在一個事物的狀況下,MySQL默認狀況是沒法完成的。
  • start transaction命令:表示開啓事務。
  • rollback命令:表示回滾事務。若是選擇回滾事務的話,數據將恢復到事物開啓以前的狀態。
  • commit命令:表示提交事務。若是選擇提交事務的話,數據更新以後將沒法恢復。

 

4、JDBC事務
    

  上面是在MySQL數據庫中管理事務,在實際開發中,更可能是在Java代碼中管理MySQL的事務。也就是說,是利用JDBC來管理MySQL事務。JDBC提供以下三種方法來管理MySQL事務:

方法摘要

void

commit()
使自從上一次提交/回滾以來進行的全部更改爲爲持久更改,並釋放此 Connection 對象當前保存的全部數據庫鎖定。

void

rollback()
取消在當前事務中進行的全部更改,並釋放此 Connection 對象當前保存的全部數據庫鎖定。

void

setAutoCommit(boolean autoCommit)
將此鏈接的自動提交模式設置爲給定狀態。

 

    MySQL事務的回滾操做,默認是回滾到開啓事務以前的數據狀態。但在實際開發中,常常須要數據回滾到某個指定的執行狀態。MySQL提供了回滾點(Savepoint)的概念,回滾點相似於遊戲中的存檔。也就是說,設置回滾點後,能夠將事務回滾到指定某個回滾點的數據狀態。下表是回滾點提供的相關方法:

方法摘要

void

releaseSavepoint(Savepoint savepoint)
從當前事務中移除給定 Savepoint 對象。

void

rollback(Savepoint savepoint)
取消設置給定 Savepoint 對象以後進行的全部更改。

Savepoint

setSavepoint()
在當前事務中建立一個未命名的保存點 (savepoint),並返回表示它的新 Savepoint 對象。

Savepoint

setSavepoint(String name)
在當前事務中建立一個具備給定名稱的保存點,並返回表示它的新 Savepoint 對象。

 
5、事務隔離級別  

  在平常MySQL的事務管理中,若是多線程開啓各自事務操做,而數據庫不負責隔離操做時,常常會出現如下三種常見問題:

  • 髒讀:指一個事務讀取到另外一個事務未提交的數據記錄。

髒讀這種操做在實際是很是危險的。例如若是B給A轉帳10000元錢,B開啓一個事務用於轉帳10000元,實際操做後並未提交事務。若是此時A查詢本身的帳戶會發現已經收到B轉帳的10000元,當A作出實際動做(發貨)後,B再將事務回滾,最終致使A損失10000元錢。

  • 不可重複讀:指一個事務中讀取指定表中的某一條數據,屢次讀取結果不一樣。

例如若是A第一次查詢帳戶爲20000元錢後,B向A轉帳10000元錢,A在第二次查詢帳戶爲30000元錢。先後兩次查詢結果不一致,A可能不知道多出的10000元錢是來自哪裏。

不可重複讀與髒讀的區別在於髒讀讀取的是前一事務未提交的數據,而不可重複讀讀取的是前一事務提交的數據。

  • 幻讀(虛讀):指一個事務中讀取到另外一個事務插入的數據,致使先後讀取結果不一致。

例如酒店統計房間預訂數量時,第一次統計爲101間被預訂,A在酒店第一次統計後,預訂了110房間,酒店在A成功預訂110房間後第二次統計,結果爲102間被預訂。致使酒店先後統計數量不一致。

幻讀與不可重複讀的區別在於不可重複讀讀取的是另外一個事務的更新操做,而幻讀讀取的是另外一個事務的插入操做(MySQL數據庫沒法測試到幻讀問題)。

針對上述的三個問題,MySQL數據庫提供了四大隔離級別來解決,這四大隔離級別分別爲:

  • SERIALIZABLE(串行化)

這個隔離級別可避免髒讀、不可重複讀、虛讀狀況的發生。

  • REPEATABLE READ(可重複讀)

這個隔離級別可避免髒讀、不可重複讀狀況的發生。

  • READ COMMITTED(讀已提交數據)

這個隔離級別可避免髒讀狀況發生。

  • READ UNCOMMITTED(讀未提交數據)

這個隔離級別最低級別,以上狀況均沒法保證。

  • 四個隔離級別的優先級:

SERIALIZABLE –> REPEATABLE READ -> READ COMMITTED -> READ UNCOMMITTED

  • 四個隔離級別的性能:

READ UNCOMMITTED -> READ COMMITTED -> REPEATABLE READ -> SERIALIZABLE

 
7、數據庫鏈接池
  概述:鏈接池是建立和管理一個鏈接的緩衝池的技術,這些鏈接準備好被任何須要它們的線程使用。這種把鏈接「聚集」起來的技術基於這樣的一個事實:對於大多數應用程序,當它們正在處理一般須要數毫秒完成的事務時,僅須要可以訪問JDBC鏈接的 1 個線程。當不處理事務時,這個鏈接就會閒置。相反,鏈接池容許閒置的鏈接被其它須要的線程使用。

鏈接池能夠極大的改善用戶的 Java 應用程序的性能,同時減小所有資源的使用。鏈接池主要的優勢有:

  • 減小鏈接建立時間。
  • 簡化的編程模式。
  • 受控的資源使用。
  常見的第三方鏈接池:
    一、DBCP     

      DBCP(DataBase connection pool),數據庫鏈接池。是 apache 上的一個 java 鏈接池項目。單獨使用dbcp須要3個包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar因爲創建數據庫鏈接是一個很是耗時耗資源的行爲,因此經過鏈接池預先同數據庫創建一些鏈接,放在內存中,應用程序須要創建數據庫鏈接時直接到鏈接池中申請一個就行,用完後再放回去。

    二、C3P0

      C3P0是一個開源的JDBC鏈接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。

      C3P0與DBCP的區別:

              dbcp沒有自動回收空閒鏈接的功能。

          c3p0有自動回收空閒鏈接功能。

    三、JNDI

     NDI(Java Naming and Directory Interface)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API,經過不一樣的訪問提供者接口JNDI API的實現,由管理者將JNDI API映射爲特定的命名服務和目錄系統,使得Java應用程序能夠和這些命名服務和目錄服務之間進行交互。集羣JNDI實現了高可靠性JNDI,經過服務器的集羣,保證了JNDI的負載平衡和錯誤恢復。在全局共享的方式下,集羣中的一個應用服務器保證本地JNDI樹的獨立性,並擁有全局的JNDI樹。每一個應用服務器在把部署的服務對象綁定到本身本地的JNDI樹的同時,還綁定到一個共享的全局JNDI樹,實現全局JNDI和自身JNDI的聯繫。

JNDI(Java Naming and Directory Interface)是一個應用程序設計的API,爲開發人員提供了查找和訪問各類命名和目錄服務的通用、統一的接口,相似JDBC都是構建在抽象層上。

JNDI(Java Naming and Directory Interface)是容許將一個Java對象綁定到一個JNDI容器(tomcat)中 ,而且爲對象指定一個名稱,經過javax.naming 包 Context 對JNDI 容器中綁定的對象進行查找,經過指定名稱找到綁定Java對象。

相關文章
相關標籤/搜索