"多态"的数据库连接池实现
Posted 补愚者说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"多态"的数据库连接池实现相关的知识,希望对你有一定的参考价值。
需求
数据库连接的池化管理
支持不同数据源链接池化处理
问题
如何维护链接对象
如何区分不同数据源池化
如何实现资源同步问题
分析
如何维护对象
使用阻塞队列实现对象存储,数据结构采用LinkedBlockingDeque(同步集合,内部线程序安全)。
如何区分不同数据源池化
即席查询中,针对不同的数据库链接,会创建不同的的数据库链接对象(connection 是线程不安全的)。为了保证安全,可以使用ThreadLocal来维护。不同的connection要缓存,并且在空闲时可以复用。内部使用数据结构ConcurrentHashMap同步集合map来维护不同数据源链接。
如何实现同步
如上,使用同步集合实现共享资源(数据库链接connection)的线程安全。
实现
思路
涉及到资源的创建,释放等。最初,依据自己的方式实现。发现底层需要考虑的同步,以及淘汰策略问题。写了个雏形,感觉不满意。于是,想到apache有一个专门的对象池处理组件。common-pool2。然后,查阅了相关资料。果然满足底层需求。其中相关组件介绍,这里不展开。common-pool2对象池(连接池)的介绍及使用,这篇文章将各组件介绍的比较详细,可参考。redis的java实现jedis底层就是借用commons-pool2实现的。
然后,使用文中介绍的GenericKeyedObjectPool,其内部就是一组k-v模型。刚好满足本文需求,实现不同数据源链接池化处理。
设计
类图
ConnectionConfig:数据链接配置
ConnectionPoolConfig:数据库连接池配置
ConnectionFactory:数据库链接
ConnectionPool:数据库连接池
ConnectionProvider:数据库链接接口
ConnectionProviderImpl:数据库链接实现
https://github.com/alanzhang211/common-db-pool
动动小手指,关注一下,是给予我最大的动力。
以上是关于"多态"的数据库连接池实现的主要内容,如果未能解决你的问题,请参考以下文章