數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣_第1頁
數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣_第2頁
數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣_第3頁
數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣?這個問題我疑問了很久很久,主要如下截圖。個連接對應(yīng)一個事務(wù),多個連接的事務(wù)是不一樣的,先大概了解一下,往下看??本人是在學(xué)threadlocal的時候,網(wǎng)上大部分人都是說數(shù)據(jù)庫連接池是典型的用了threadloca的例子,然后我就又查數(shù)據(jù)庫連接池和threadloca的關(guān)系,但是,99%都說threadlocal是為了在并發(fā)的情況下,為了保證線程安全,創(chuàng)建了副本什么的,其實這只是threadlocal的用法之一,它還有個用法就是確保同一線程之間參數(shù)傳遞的方便(扯遠了)回歸正題,還是拿上面的圖來說事。。。。我只講兩個關(guān)鍵點,明白人一看就懂:1、兩者有根本性的區(qū)別,用處不一樣!連接池是緩存并托管數(shù)據(jù)庫連接,主要是為了提高性能。而ThreadLocal緩存連接,是為了把同一個數(shù)據(jù)庫連接“分享”給同一個線程的不同調(diào)用方法。(不管調(diào)用哪個方法,都是使用的同一個連接,方便進行“跨方法”的事務(wù)控制)舉個栗子:如果一個請求中涉及多個DAO操作,而如果這些DAO中的Connection都是獨立的話,就沒有辦法完成一個事務(wù)。但是如果DAO中的Connection是從ThreadLocal中獲得的(意味著都是同一個對象),那么這些DAO就會被納入到同一個Connection之下。在公眾號后端架構(gòu)師后臺回復(fù)“架構(gòu)整潔”,獲取一份驚喜禮包。2、重點要理解“連接池”。連接池里面有一定數(shù)量的連接資源,比如最大20個連接。題外話:如果直接通過Java原生API獲取“直連”的話:底層方法一般都是這樣寫的:java.sql.DriverManager.getConnection(url,

props);

java.sql.Driver.connect(url,

props);特點是:要傳入url、用戶名和密碼等信息)這種方式,肯定就沒有使用數(shù)據(jù)庫連接池。使用數(shù)據(jù)庫連接池,通常都是得到一個所謂的javax.sql.DataSource[接口]的實例對象,它里面包含了Connection,并且數(shù)據(jù)庫連接池工具類(比如C3P0、JNDI、DBCP等),肯定是重新定義了getConnection、closeConnection等方法,所以你每次得到的Connection,幾乎都不是新建立的連接(而是已經(jīng)建立好并放到緩存里面的連接),你調(diào)用closeConnection方法,也不是真正的關(guān)閉連接(一般都是起到一個標(biāo)識作用,標(biāo)識當(dāng)前連接已經(jīng)使用完畢,歸還給連接池,讓這個連接處于待分配狀態(tài))PS:所以說:使用數(shù)據(jù)庫連接池時,還是要顯式的調(diào)用數(shù)據(jù)庫連接池API提供的關(guān)閉連接的方法。理解一下這句話:不同的線程在同一個時間(或者同一個線程在多個地方)從連接池中拿到的Connection,肯定不是同一個連接。(反過來講:不同時間的兩個線程,一前一后,則有可能拿到同一個連接)總結(jié):再好好理解一下上面的一段話,我再最后解釋億下。。。首先,我們?yōu)榱吮苊鈫我粩?shù)據(jù)庫連接的創(chuàng)建和關(guān)閉耗費時間和性能,引入了數(shù)據(jù)庫連接池,提前創(chuàng)建好了n條連接放入池中,如果是單線程情況下,那這樣挺好的那如果是多線程情況下呢?還是上面那段話,假設(shè)同一時間多個線程從數(shù)據(jù)庫連接池獲取連接,那肯定拿的是不同的連接,我當(dāng)前線程和別的線程拿的連接不一樣,那我當(dāng)前在crud的時候,不在一個事務(wù)之內(nèi)。假設(shè)不同時間的多個線程要從數(shù)據(jù)庫連接池拿連接,那這個時候就可能拿到的是同一個連接了,那我多個線程線程拿到的是同一個連接,也就是說在多個線程在同一個事務(wù)之內(nèi),線程a執(zhí)行了插入還沒來得及提交,線程b此時來了個更新,在線程a還未操作完之前,線程b更新完了后,直接把連接給close了,線程a插了一半發(fā)現(xiàn)插不了了。。。此時肯定在想,這?是誰在搞我。為了確保不同時間多個線程可能拿到的是同一個連接,那么此時threadlocal閃亮登場,就算我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論