數(shù)據(jù)庫連接池為什么要用ThreadLocal呢?
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

1、兩者有根本性的區(qū)別,用處不一樣!
2、重點(diǎn)要理解“連接池”。
題外話:如果直接通過 Java原生API 獲取“直連”的話:
java.sql.DriverManager.getConnection(url, props);
java.sql.Driver.connect(url, props);
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)事情
3、ConcurrentHashMap有十個(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)生指北
評(píng)論
圖片
表情
