首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

稳,从数据库连接池 testOnBorrow 看架构设计

本文从 Commons DBCP testOnBorrow 的作用机制着手,管中窥豹,从一点去分析数据库连接池获取的过程以及架构分层设计。

以下内容会按照每层的作用,贯穿分析整个调用流程。

一、框架层 commons-pool

The indication of whether objects will bevalidated before being borrowedfrom the pool.

If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.

testOnBorrow 不是 dbcp 定义的,是commons-pool 定义的。commons-pool 详细地定义了资源池使用的一套规范和运行流程。

二、应用层 commons-dbcp

dbcp 是特定于管理数据库连接的资源池。

PoolableConnectionFactory?is a PooledObjectFactory

PoolableConnection is a PooledObject

三、基础层 mysql-connector-java

Returns true if the connection has not been closed and is still valid.

这个是 java.sql.Connection 定义的规范。具体实现根据对应数据库的driver 来完成。使用某种机制用来探测连接是否可用。

参考:MySQL 的连接时长控制--interactive_timeout和wait_timeout_翔云123456的博客-CSDN博客

四、总结

commons-pool 定义资源的完整声明周期接口,包括:makeObject、activateObject、validateObject、passivateObject、destoryObject。资源池管理对象,通过实现这些接口即可实现资源控制。参考:org.apache.commons.pool2.PooledObjectFactory

在校验过程中,牵涉到很多时间,包括资源池对象的创建时间、生存时间、数据库连接的超时时间、Mysql 连接空闲超时时间等。不同层为了服务可靠性,提供不同的时间配置。校验也是层层递进,最终委托到最底层来判断。

校验过程中,对于连接也会由是否已关闭的校验(isClosed())。包括PoolableConnection#isClosed,Connection#isClosed, Socket#isClosed。同样也是层层保障,确保整个架构的可靠。

定义一套完整严谨的规范和标准,比实现一个具体的功能或者特性要求更高。commons-pool 和 jdbc 定义了规范,commons-dbcp 和 mysql-connector-java 完成了具体的实现。有了规范和接口,组件和框架的对接和兼容才变为可能。

more 理解高可用

在阅读 MySQL Driver 源码过程中,有个点要特别记录下。以 MySQL Driver 创建连接为例,用重试连接实现可用性,这就是高可用。

高可用不是一个口号,也不是复杂的概念和公式。能够实实在在体系化地解决一类问题就是架构的目的。结合上述的架构分层,如果解决问题的方案通用性好,并且实现很优雅,就是好的架构。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O197WPe6iJuI6E4ns5qIjKPw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com