数据库连接池为啥要用 ThreadLocal?不用会怎么样?
上一篇:深夜看了张一鸣的微博,让我越想越后怕
这个问题我疑问了很久很久,主要如下截图。
一个连接对应一个事务,多个连接的事务是不一样的,先大概了解一下,往下看????
本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和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一份,这样就互相不干扰了。
原文链接:https://blog.csdn.net/qq_42405666/article/details/108258820
感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。
· END ·
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
正文结束
推荐阅读 ↓↓↓
1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
2.如何才能成为优秀的架构师?
3.从零开始搭建创业公司后台技术栈
4.程序员一般可以从什么平台接私活?
5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看
7.漫画:程序员相亲图鉴,笑屎我了~
8.15张图看懂瞎忙和高效的区别!
一个人学习、工作很迷茫?
点击「阅读原文」加入我们的小圈子!
数据库连接池为啥要用 ThreadLocal?不用会怎么样?相关推荐
- 数据库连接池为什么要用threadlocal呢?不用会怎样?
点击关注公众号,Java干货及时送达 来源:blog.csdn.net/qq_42405666/article/details/108258820 这个问题我疑问了很久很久,主要如下截图. 个连接对应 ...
- 数据库连接池为什么要用threadlocal呢?(不用会怎样?)
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 这个问题我疑问了 ...
- 将connection存放在Threadlocal里和数据库连接池的区别
我有几点不太明白的,望各位大侠指教下. 1.j2ee的应用中,有一个用户请求就会启动一个线程.而如果我们把connection放在Threadlocal里的话,那么我们的程序只需要一个connecti ...
- mysql连接池为何不用nio_为什么要用数据库连接池?
1.为什么要用数据库连接池? 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库 都有一定的资源负荷,尤其应用压力较大时资源占用比 ...
- Java数据库连接池的实现(不用框架)
前言:因为需要正式做项目,了解到了连接池这个东西.在网上找了很多资料,发现都是大同小异,各种转载,看上去搜出来了几十个答案,结果很可能是同一个.并且大多都是基于框架的数据库连接池.可是我只是想采用MV ...
- Spring Boot 2.0选择HikariCP作为默认数据库连接池的五大理由
转载自公众号:工匠小猪猪的技术世界 摘要: 本文非原创,是「工匠小猪猪的技术世界」搜集了一些HikariCP相关的资料整理给大家的介绍,主要讲解了为什么sb2选择了HikariCP以及HikariCP ...
- JavaWeb:JDBC之数据库连接池
JDBC系列阅读 JavaWeb:用JDBC操作数据库 JavaWeb:JDBC之事务 JavaWeb:JDBC之数据库连接池 使用JDBC实现水果超市管理系统 1. 池参数(所有池参数都有默认值) ...
- python数据库连接池工具类_Python数据库连接池DBUtils
DBUtils简介 DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放 ...
- 基于DBUtils实现数据库连接池
小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类def __init__(self,name,breed, life_value,aggr):# Animal ...
- Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由
转载自公众号:工匠小猪猪的技术世界 摘要: 本文非原创,是笔者搜集了一些HikariCP相关的资料整理给大家的介绍,主要讲解了为什么sb2选择了HikariCP以及HikariCP为什么这么快. Sp ...
最新文章
- 个人站点渲染和跳转过滤功能
- 机器视觉与机器学习牛人博客
- SAP BPC最佳实践-如何配置和使用BPC的钻取Drill through
- 删除主串中模式串出现的字符
- kaggle房价预测特征意思_Kaggle实战-波士顿房价预测
- 腾讯面试题: 百度搜索为什么那么快? | 原力计划
- JDK自带观察者的使用
- 【转】如何查找MySQL中慢查询的SQL语句
- 从vmware下载到Linux环境下jdk和maven的安装
- 论文笔记-《深度卷积神经网络的发展及其在计算机视觉领域的应用》
- App、小程序、H5的区别
- Qt中出现0xc0000135错误
- [树 乱搞] BZOJ 4238 电压
- LeetCode 417.太平洋大西洋水流问题
- 【视频处理】视频拼接视频缝合手把手教你
- Linux下进行格式化移动硬盘(U盘)以及分区
- Python web开发框架—— Pyramid学习(一)
- Node.js聊天室
- 什么是真实--有感于“嫁人就要嫁范跑跑!”
- 使用sklear.metrics计算precision等指标
热门文章
- Riot v4.0.0-alpha.10 发布,JavaScript 的 MVP 框架
- 原生JS大揭秘—事件循环机制Event Loop
- SharePoint专家新闻轮转器WebPart----亲測力推之Web部件
- windows 架设SVN服务器
- logrotate 对某个日志的配置
- mysql 忘记密码解决方法(有用)
- wojilu系统的ORM代码解析-[源代码结构分析,用特性和反射来感知属性-特性介绍篇]...
- 看到好文章了(linux内核方面),大家共分享
- poj 2231 Moo Volume 暴力一定超时啊
- 无法启用iPhone、iPhone 启用错误?用Tenorshare ReiBoot 及 4MeKey 解决