理解數據庫連接池和ThreadLocal實現的事務控制


 

我發現 不少人 誤解了這兩者。 csdn上也有人提出過這種疑問:

http://bbs.csdn.net/topics/250061733

 

經過查閱資料和認真分析,我特說明一下這兩者概念上的區別。

 

我只講兩個關鍵點,明白人一看就懂:

1、兩者有根本性的區別,用處不一樣!

   1)連接池是緩存並托管數據庫連接,主要是為了提高性能。

   2)而ThreadLocal緩存連接,是為了把同一個數據庫連接“分享”給同一個線程的不同調用方法。(不管調用哪個方法,都是使用的同一個連接,方便進行“跨方法”的事務控制)

  舉個例子: 

  如果一個請求中涉及多個 DAO 操作,而如果這些DAO中的Connection都是獨立的話,就沒有辦法完成一個事務。但是如果DAO 中的 Connection 是從 ThreadLocal 中獲得的(意味着都是同一個對象), 那么這些 DAO 就會被納入到同一個 Connection 之下。

2、重點要理解“連接池”。

 連接池里面有一定數量的連接資源,比如最大20個連接。

題外話:如果直接通過 Java原生API 獲取“直連”的話:

  (底層方法一般都是這樣寫的:

       java.sql.DriverManager.getConnection(url, props);

       java.sql.Driver.connect(url, props);

  特點是:要傳入url、用戶名和密碼等信息)

  這種方式,肯定就沒有使用數據庫連接池。

使用數據庫連接池,通常都是得到一個所謂的javax.sql.DataSource[接口]的實例對象,它里面包含了Connection,並且數據庫連接池工具類(比如C3P0、JNDI、DBCP等),肯定是重新定義了getConnection、closeConnection等方法,所以你每次得到的Connection,幾乎都不是新建立的連接(而是已經建立好並放到緩存里面的連接),你調用closeConnection方法,也不是真正的關閉連接(一般都是起到一個標識作用,標識當前連接已經使用完畢,歸還給連接池,讓這個連接處於待分配狀態)【PS:所以說:使用數據庫連接池時,還是要顯式的調用數據庫連接池API提供的關閉連接的方法】。

       理解一下這句話:

    不同的線程在同一個時間( 或者 同一個線程在多個地方) 從連接池中拿到的Connection,肯定不是同一個連接。(反過來講:不同時間的兩個線程,一前一后,則有可能拿到同一個連接)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM