數(shù)據(jù)庫連接池為什么要用threadlocal呢?不用會怎樣?
閱讀本文大概需要 3 分鐘。
來自:blog.csdn.net/qq_42405666/article/details/108258820

1、兩者有根本性的區(qū)別,用處不一樣!
2、重點要理解“連接池”。
題外話:如果直接通過 Java原生API 獲取“直連”的話:
java.sql.DriverManager.getConnection(url, props);
java.sql.Driver.connect(url, props);
PS:所以說:使用數(shù)據(jù)庫連接池時,還是要顯式的調(diào)用數(shù)據(jù)庫連接池API提供的關閉連接的方法。
不同的線程在同一個時間( 或者 同一個線程在多個地方)從連接池中拿到的Connection,肯定不是同一個連接。(反過來講:不同時間的兩個線程,一前一后,則有可能拿到同一個連接)
總結:
首先,我們?yōu)榱吮苊鈫我粩?shù)據(jù)庫連接的創(chuàng)建和關閉耗費時間和性能,引入了數(shù)據(jù)庫連接池,提前創(chuàng)建好了n條連接放入池中,如果是單線程情況下,那這樣挺好的 那如果是多線程情況下呢?還是上面那段話,假設同一時間多個線程從數(shù)據(jù)庫連接池獲取連接,那肯定拿的是不同的連接,我當前線程和別的線程拿的連接不一樣,那我當前在crud的時候,不在一個事務之內(nèi)。 假設不同時間的多個線程要從數(shù)據(jù)庫連接池拿連接,那這個時候就可能拿到的是同一個連接了,那我多個線程線程拿到的是同一個連接,也就是說在多個線程在同一個事務之內(nèi),線程a執(zhí)行了插入還沒來得及提交,線程b此時來了個更新,在線程a還未操作完之前,線程b更新完了后,直接把連接給close了,線程a插了一半發(fā)現(xiàn)插不了了。。。此時肯定在想,這?是誰在搞我。 為了確保不同時間多個線程可能拿到的是同一個連接,那么此時threadlocal閃亮登場,就算我拿的是“同一個連接”,在引入了threadlocal后,每個線程之間都會創(chuàng)建獨立的連接副本,將collection各自copy一份,這樣就互相不干擾了。
以上是我的個人見解。
推薦閱讀:
快來試試 Spring Boot 應用可視化監(jiān)控,一目了然!
最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結構等等。
朕已閱 
評論
圖片
表情

