数据库连接池的选择 | 实现

Posted 无生活不技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池的选择 | 实现相关的知识,希望对你有一定的参考价值。

新年的第一个工作日,愿我们的2018更好!

在基于JVM的后台开发的中,在高并发场景下,往往会有一些对象,如数据库连接、线程...等对象,它的创建和初始化需要的时间比较长,当在大量使用这些对象时,如果不采取一些技术上的优化,就会造成一些效率和性能上的问题。


对于这种问题常见的简单优化办法就是使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,下次使用的时候,不用再重新创建,可以直接从对象池的缓存中取即可,通过空间换时间,不必每次都创建和关闭对象。

 

本文就是基于commons-pool2利用Java语言简单实现高可用的对象池,这里我没有从最底层开始造轮子,而是使用了这种开源的对象池化组件,它已经进行了很好的封装,我只是简单做一下封装和实现了部分接口而已。通过这种方式,我们可以实现各种数据库的连接池,如MySQL,Oracle,Redis,HBase,…


本系列文章首先以关系型数据库MySQL来举例实现(PS典型的数据库连接池有cp03和dbcp,Druid,Kikari…,但这里实现的目的是为了做一个通用一点的连接池,以同样的方式来实现对其他数据库,包括非关系型数据库的连接池),后续将陆续推出各种以同样的方式实现的其他数据连接池。


1.首先简单介绍一下

Apache Common-pool2,它主要由三大模块组成:

ObjectPool、

PooledObject

PooledObjectFactory。 

具体的含义和详细的使用介绍可以参考官方文档

(这里强烈推荐阅读,才能够明白接下来文章简单描述的内容的具体含义):

http://commons.apache.org/proper/commons-pool/

API使用:

http://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/package-summary.html

 

2.首先对comom-pool2做一个简单的封装:


2.1 写一个默认的PoolConfig配置类,其中参数是自定义一些默认参数。PoolConfig->GenericOjbectPoolConfig

数据库连接池的选择 | 实现

2.2 abstract PoolBase接下来实现一个池基类(基于PooledObjectFactory和GenericObjectPool)如对具体实现没有概念,可以参考pool2 api的实现。

数据库连接池的选择 | 实现

PoolBase池基类的结构如下:

数据库连接池的选择 | 实现

2.3 interface ConnectionFactory 第三步实现连接池工厂类

数据库连接池的选择 | 实现

2.4 interface ConnectionPool 第四步实现一个连接池接口

数据库连接池的选择 | 实现

 2.5 最后再自定义一个异常类:ConnectionException

数据库连接池的选择 | 实现

至此,通用的连接池模块已经实现。

 

3.针对特定的数据库来做一个接口实现,本系列第一篇,采用mysql来举例实现:


3.1 首先第一步实现一个默认的jdbcConfig默认配置类:

数据库连接池的选择 | 实现

3.2 实现JdbcConnectionFactory

数据库连接池的选择 | 实现

JdbcConnectionFactory类结构如下:

数据库连接池的选择 | 实现

3.3 实现jdbcConnectionPool

数据库连接池的选择 | 实现

此时,jdbc对象连接池已经实现,接下来,我们写一个demo来演示一下,这里只是demo,所以各种参数之类的都直接写在测试类当中。


注意:实际生产环境中参数的一般都是通过配置,传递,校验等方式,获取连接池等都会通过工具类来获取与释放。


数据库连接池的选择 | 实现

4.从本地数据库中,查询一个字段打印出来

数据库连接池的选择 | 实现

类中方法如下(实际使用可以抽取到工具类中):

数据库连接池的选择 | 实现

控制台显示如下:

数据库连接池的选择 | 实现

工程目录结构如下:

数据库连接池的选择 | 实现

 数据库中有两条记录:

最后:这里没有给出具体的代码,主要是考虑到大家只要了解了具体的对象池思想,就可以去自由的使用自己的方式来实现,并不局限于使用某种编程语言的层面,当然本文也只是个人的看法和理解,并不能代表这样就是好的,欢迎大家指正和批评,有任何疑问,都可以交流和探讨。


以上是关于数据库连接池的选择 | 实现的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池的Java连接池

Java - 数据库连接池的选择 Druid

连接池的基本原理? 以及使用连接池的好处?

从零开始学Java-数据库连接池的选择 Druid

如何查看连接池的使用情况

数据库连接池的选择 Druid