日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库连接池为什么要用threadlocal呢?(不用会怎样?)

發布時間:2024/4/11 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库连接池为什么要用threadlocal呢?(不用会怎样?) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“朱小廝的博客”,選擇“設為星標”

后臺回復"書",獲取

后臺回復“k8s”,可領取k8s資料

這個問題我疑問了很久很久,主要如下截圖。

我先說為什么引入threadlocal,其實是為了解決數據庫事務,而事務是和連接有關的,每個連接對應一個事務,多個連接的事務是不一樣的,先大概了解一下,往下看????

本人是在學threadlocal的時候,網上大部分人都是說數據庫連接池是典型的用了threadlocal的例子,然后我就又查數據庫連接池和threadloca的關系,但是,99%都說threadlocal是為了在并發的情況下,為了保證線程安全,創建了副本什么的,其實這只是threadlocal的用法之一,它還有個用法就是確保同一線程之間參數傳遞的方便(扯遠了)

回歸正題,還是拿上面的圖來說事。。。。

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

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

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

  • 而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,肯定不是同一個連接。(反過來講:不同時間的兩個線程,一前一后,則有可能拿到同一個連接)

總結:

再好好理解一下上面的一段話,我再最后解釋億下。。。


  • 首先,我們為了避免單一數據庫連接的創建和關閉耗費時間和性能,引入了數據庫連接池,提前創建好了n條連接放入池中,如果是單線程情況下,那這樣挺好的

  • 那如果是多線程情況下呢?還是上面那段話,假設同一時間多個線程從數據庫連接池獲取連接,那肯定拿的是不同的連接,我當前線程和別的線程拿的連接不一樣,那我當前在crud的時候,不在一個事務之內。

  • 假設不同時間的多個線程要從數據庫連接池拿連接,那這個時候就可能拿到的是同一個連接了,那我多個線程線程拿到的是同一個連接,也就是說在多個線程在同一個事務之內,線程a執行了插入還沒來得及提交,線程b此時來了個更新,在線程a還未操作完之前,線程b更新完了后,直接把連接給close了,線程a插了一半發現插不了了。。。此時肯定在想,這?是誰在搞我。

  • 為了確保不同時間多個線程可能拿到的是同一個連接,那么此時threadlocal閃亮登場,就算我拿的是“同一個連接”,在引入了threadlocal后,每個線程之間都會創建獨立的連接副本,將collection各自copy一份,這樣就互相不干擾了。

摘要: 原創出處 blog.csdn.net/qq_42405666/article/details/108258820 「Hello什么來著?」歡迎轉載,保留摘要,謝謝!

想知道更多?描下面的二維碼關注我

后臺回復"技術",加入技術群

后臺回復“k8s”,可領取k8s資料

【精彩推薦】

  • ClickHouse到底是什么?為什么如此牛逼!

  • 原來ElasticSearch還可以這么理解

  • 面試官:InnoDB中一棵B+樹可以存放多少行數據?

  • 架構之道:分離業務邏輯和技術細節

  • 星巴克不使用兩階段提交

  • 面試官:Redis新版本開始引入多線程,談談你的看法?

  • 喜馬拉雅自研網關架構演進過程

  • 收藏:存儲知識全面總結

  • 微博千萬級規模高性能高并發的網絡架構設計

總結

以上是生活随笔為你收集整理的数据库连接池为什么要用threadlocal呢?(不用会怎样?)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。