关于java:数据库连接池为啥要用-ThreadLocal

51次阅读

共计 1917 个字符,预计需要花费 5 分钟才能阅读完成。

这个问题我疑难了很久很久,次要如下截图。

一个连贯对应一个事务,多个连贯的事务是不一样的,先大略理解一下,往下看👇

自己是在学 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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0