1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        數(shù)據(jù)庫連接池為什么要用ThreadLocal呢?

        共 2236字,需瀏覽 5分鐘

         ·

        2021-05-17 11:48

        往期熱門文章:

        1、【建議收藏】面試官會(huì)問的位運(yùn)算奇淫技巧
        2、Top 16 的 Java 工具類,你用過幾個(gè)?
        3、到底可不可以用 kill -9 關(guān)閉程序?
        4、IDEA 2021首個(gè)大版本發(fā)布,新增了這幾個(gè)超實(shí)用功能!
        5、Optional 是個(gè)好東西,你真的會(huì)用么?

        來源:blog.csdn.net/qq_42405666/article/details/108258820

        這個(gè)問題我疑問了很久很久,主要如下截圖。
        個(gè)連接對(duì)應(yīng)一個(gè)事務(wù),多個(gè)連接的事務(wù)是不一樣的,先大概了解一下,往下看??
        本人是在學(xué)threadlocal的時(shí)候,網(wǎng)上大部分人都是說數(shù)據(jù)庫連接池是典型的用了threadloca的例子,然后我就又查數(shù)據(jù)庫連接池和threadloca的關(guān)系,但是,99%都說threadlocal是為了在并發(fā)的情況下,為了保證線程安全,創(chuàng)建了副本什么的,其實(shí)這只是threadlocal的用法之一,它還有個(gè)用法就是確保同一線程之間參數(shù)傳遞的方便(扯遠(yuǎn)了)
        回歸正題,還是拿上面的圖來說事。。。。
        我只講兩個(gè)關(guān)鍵點(diǎn),明白人一看就懂:

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

        連接池是緩存并托管數(shù)據(jù)庫連接,主要是為了提高性能。
        而ThreadLocal緩存連接,是為了把同一個(gè)數(shù)據(jù)庫連接“分享”給同一個(gè)線程的不同調(diào)用方法。(不管調(diào)用哪個(gè)方法,都是使用的同一個(gè)連接,方便進(jìn)行“跨方法”的事務(wù)控制)
        舉個(gè)栗子:
        如果一個(gè)請求中涉及多個(gè) DAO 操作,而如果這些DAO中的Connection都是獨(dú)立的話,就沒有辦法完成一個(gè)事務(wù)。但是如果DAO 中的 Connection 是從 ThreadLocal 中獲得的(意味著都是同一個(gè)對(duì)象), 那么這些 DAO 就會(huì)被納入到同一個(gè) Connection 之下。

        2、重點(diǎn)要理解“連接池”。

        連接池里面有一定數(shù)量的連接資源,比如最大20個(gè)連接。
        題外話:如果直接通過 Java原生API 獲取“直連”的話:
        底層方法一般都是這樣寫的:
        java.sql.DriverManager.getConnection(url, props);

        java.sql.Driver.connect(url, props);
        特點(diǎn)是:要傳入url、用戶名和密碼等信息)
        這種方式,肯定就沒有使用數(shù)據(jù)庫連接池。
        使用數(shù)據(jù)庫連接池,通常都是得到一個(gè)所謂的javax.sql.DataSource[接口]的實(shí)例對(duì)象,它里面包含了Connection,并且數(shù)據(jù)庫連接池工具類(比如C3P0、JNDI、DBCP等),肯定是重新定義了getConnection、closeConnection等方法,所以你每次得到的Connection,幾乎都不是新建立的連接(而是已經(jīng)建立好并放到緩存里面的連接),你調(diào)用closeConnection方法,也不是真正的關(guān)閉連接(一般都是起到一個(gè)標(biāo)識(shí)作用,標(biāo)識(shí)當(dāng)前連接已經(jīng)使用完畢,歸還給連接池,讓這個(gè)連接處于待分配狀態(tài))
        PS:所以說:使用數(shù)據(jù)庫連接池時(shí),還是要顯式的調(diào)用數(shù)據(jù)庫連接池API提供的關(guān)閉連接的方法。
        理解一下這句話:
        不同的線程在同一個(gè)時(shí)間( 或者 同一個(gè)線程在多個(gè)地方)從連接池中拿到的Connection,肯定不是同一個(gè)連接。(反過來講:不同時(shí)間的兩個(gè)線程,一前一后,則有可能拿到同一個(gè)連接)

        總結(jié):

        再好好理解一下上面的一段話,我再最后解釋億下。。。
        • 首先,我們?yōu)榱吮苊鈫我粩?shù)據(jù)庫連接的創(chuàng)建和關(guān)閉耗費(fèi)時(shí)間和性能,引入了數(shù)據(jù)庫連接池,提前創(chuàng)建好了n條連接放入池中,如果是單線程情況下,那這樣挺好的
        • 那如果是多線程情況下呢?還是上面那段話,假設(shè)同一時(shí)間多個(gè)線程從數(shù)據(jù)庫連接池獲取連接,那肯定拿的是不同的連接,我當(dāng)前線程和別的線程拿的連接不一樣,那我當(dāng)前在crud的時(shí)候,不在一個(gè)事務(wù)之內(nèi)。
        • 假設(shè)不同時(shí)間的多個(gè)線程要從數(shù)據(jù)庫連接池拿連接,那這個(gè)時(shí)候就可能拿到的是同一個(gè)連接了,那我多個(gè)線程線程拿到的是同一個(gè)連接,也就是說在多個(gè)線程在同一個(gè)事務(wù)之內(nèi),線程a執(zhí)行了插入還沒來得及提交,線程b此時(shí)來了個(gè)更新,在線程a還未操作完之前,線程b更新完了后,直接把連接給close了,線程a插了一半發(fā)現(xiàn)插不了了。。。此時(shí)肯定在想,這?是誰在搞我。
        • 為了確保不同時(shí)間多個(gè)線程可能拿到的是同一個(gè)連接,那么此時(shí)threadlocal閃亮登場,就算我拿的是“同一個(gè)連接”,在引入了threadlocal后,每個(gè)線程之間都會(huì)創(chuàng)建獨(dú)立的連接副本,將collection各自copy一份,這樣就互相不干擾了。
        以上是我的個(gè)人見解。

        往期熱門文章:

        1、歷史文章分類導(dǎo)讀列表!精選優(yōu)秀博文都在這里了!》

        2、七種方式教你在Spring Boot初始化時(shí)搞點(diǎn)事情

        3ConcurrentHashMap有十個(gè)提升性能的地方,你都知道嗎?
        4程序員等級(jí)圖鑒
        5、Java 中的 Switch 都支持 String 了,為什么不支持 long?
        6、為什么數(shù)據(jù)庫字段要使用NOT NULL?
        7、CTO 說了,用錯(cuò) @Autowired 和 @Resource 的人可以領(lǐng)盒飯了
        8、程序員離職事件始末

        9、別總寫代碼,這130個(gè)網(wǎng)站比漲工資都重要
        10、程序員養(yǎng)生指北

        瀏覽 71
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级黄色电影网站 | 扒开美女狂揉下部漫画 | 人人干人人模 | 91无码人妻 | 国模吧一二三四视频区 | 国产无遮无挡120秒 | 在线看黄片视频 | 被别人巨茎征服的娇妻视频 | 青青草国产 | 国产伦清品一区二区三区 |