头条面试官:数据库连接池为什么要用threadlocal呢?我有点懵逼。。。

沙海
沙海
沙海
1532
文章
2
评论
2021年5月31日04:31:39
评论
3 2136字阅读7分7秒
摘要

智能摘要

智能摘要

连接池是缓存并托管数据库连接,主要是为了提高性能。Connection是从ThreadLocal中获得的(意味着都是同一个对象),那么这些DAO就会被纳入到同一个Connection之下。连接池里面有一定数量的连接资源,比如最大20个连接。使用数据库连接池时,还是要显式的调用数据库连接池API提供的关闭连接的方法。同一个线程在多个地方)从连接池中拿到的Connection,肯定不是同一个连接。

原文约 1888 | 图片 7 | 建议阅读 4 分钟 | 评价反馈

头条面试官:数据库连接池为什么要用threadlocal呢?我有点懵逼。。。

点击关注 ? Java面试那些事儿

收录于话题

#Java面试那些事儿

141个

大家好,我是D哥

点击关注下方公众号,Java面试资料 都在这里

来源:blog.csdn.net/qq_42405666/article/details/108258820

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

头条面试官:数据库连接池为什么要用threadlocal呢?我有点懵逼。。。

个连接对应一个事务,多个连接的事务是不一样的,先大概了解一下,往下看?

本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和threadloca的关系,但是,99%都说threadlocal是为了在并发的情况下,为了保证线程安全,创建了副本什么的,其实这只是threadlocal的用法之一,它还有个用法就是确保同一线程之间参数传递的方便(扯远了)

回归正题,还是拿上面的图来说事。。。。

我只讲两个关键点,明白人一看就懂:

# 两者有根本性的区别,用处不一样!

连接池是缓存并托管数据库连接,主要是为了提高性能。

而ThreadLocal缓存连接,是为了把同一个数据库连接“分享”给同一个线程的不同调用方法。(不管调用哪个方法,都是使用的同一个连接,方便进行“跨方法”的事务控制)

举个栗子:

如果一个请求中涉及多个 DAO 操作,而如果这些DAO中的Connection都是独立的话,就没有办法完成一个事务。但是如果DAO 中的 Connection 是从 ThreadLocal 中获得的(意味着都是同一个对象), 那么这些 DAO 就会被纳入到同一个 Connection 之下。

# 重点要理解“连接池”。

连接池里面有一定数量的连接资源,比如最大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,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)

    # 总结:

    再好好理解一下上面的一段话,我再最后解释亿下。。。

    热门推荐:记一次被老大骂的性能优化案例:单台 4 核 8G 机器支撑 5 万 QPS~老婆总是问我时间多久?于是我做了这个工具(附源码)快手二面:竟然被问到消息队列 RabbitMQ,太难了简历&面试题&视频资料获取 扫描下方二维码,回复关键字【 java】

    继续阅读
    weinxin
    资源分享QQ群
    本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
    沙海
    匿名

    发表评论

    匿名网友 填写信息

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: