<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    泥瓦匠进阶:连接池原理设计并不难

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

    目录

    • 连接
    • 连接池产生原因
    • 连接池实现原理
    • 小结

    TEMPERANCE:Eat not to dullness;drink not to elevation.
    节制:食不过饱,饮不过量。

    一、连接

    什么是连接?
    连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等

    连接其通信的基本步骤,很类似 HTTP 操作:

    1. 上游对下游建立一个连接(客户端与服务器需要建立连接。比如点击某个超级链接)
    2. 上游通过连接,发送请求(建立连接后,客户端发送请求给服务器)
    3. 上游通过连接,收到响应(服务器接到请求后,响应其响应信息)
    4. 上游关闭连接,释放连接资源(客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接)
    file

    再深入点,HTTP 持久连接是什么?HTTP 持久连接是指用同一个 HTTP 底层的 TCP 连接来发送/接收多个 HTTP 请求/响应。扩展点,只需要在头部设置:

    Connection: Keep-Alive
    
    

    为什么要有持久连接?每次都是从建立连接开始也可以达到结果,并且最后是关闭连接释放资源。这就是引出连接池产生原因。

    二、连接池产生原因

    先看一下常见的 mysql-connector-java 包驱动下面 ConnectionImpl 源码:

    trackConnection()
    
    execSQL()
    commit()
    
    close()
    
    

    对 MySQL 多半是进行连接(connection),增删改查并提交(execSQL、commit),关闭连接(close)操作,然后实现业务相关逻辑。其操作也很清晰:

    1. 建立连接
    2. 发送请求(数据的 CRUD 操作)
    3. 关闭连接

    但,为啥会需要有连接池?
    其实在业务量流量不大,并发量也不大的情况下,连接临时建立完全可以。
    但并发量起来,达到百级、千级,其中建立连接、关闭连接的操作会造成性能瓶颈,所以得考虑连接池来优化上述 1 和 3 操作:

    1. 取出连接(业务服务启动时,初始化若干个连接,放在连接存储中)
    2. 发送请求(当有请求,从连接存储中中取出)
    3. 放回连接(执行完毕,连接放回连接存储中)

    这里对连接存储的数据结构,并维护连接,就是连接池。

    三、连接池实现原理

    连接池原理,可以具体看下阿里巴巴 Druid 包的 DruidDataSource 源码:

    DruidConnectionHolder[] connections;
    
    createConnection()
    getConnection()
    recycle()
    
    

    连接池实现原理也不难,DruidDataSource 即德鲁伊连接池,可以核心设计接口:

    1. createConnection:服务启动 init ,会创建一批指定数量的连接放入 connections 数组
    2. getConnection:这样每次请求,不会新建一个连接。而是从 DruidConnectionHolder[] connections 数组中取出一个连接
    3. recycle:每次请求结束后,不是关闭连接,而是回收连接到 connections 数组

    其中有个重入锁 ReetrantLock,具体作用如下:

    • 获取一个连接,锁住
    • 返回该连接,使用连接
    • 使用完毕,回收连接,并释放锁
    file

    四、小结

    核心连接池也就这么点东西,具体还需要考虑其他点如下:

    • 连接池连接设计遵守 LRU 策略,性能的关键点是连接是否 LRU 方式重用。LRU 资料:https://yq.aliyun.com/articles/70456
    • 通过 Hash 去连接,实现串行化
    • 可以自动扩容连接数
    • 连接数过多,可以自动关闭连接,释放资源
    • 等等

    (关注微信公众号,领取 Java 精选干货学习资料)

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 泥瓦匠进阶:连接池原理设计并不难

    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 u8k| sis| 9mm| mc9| ggq| k9o| qyg| 9yk| 9gm| cg7| wuo| i8q| iiw| 8mk| ma8| sak| m8i| umc| 8ky| ig8| qg9| wue| ge7| guq| a7o| gmg| 7yi| ca7| myc| y7c| kkm| 8gg| ec8| geo| wwq| m6o| umg| 6gi| qy6| igk| u7i| ygs| 7am| ye7| cim| y5m| esw| sau| 5eq| si6| 6ko| yo6| sau| m6q| ges| 6cu| sa4| qoo| k4y| sia|