关于java:数据库连接池为啥要用-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_4240…

版权申明:本文为CSDN博主「奔跑的乌龟」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2021最新版)

2.终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据