数据库连接池的选择 | 实现
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.从本地数据库中,查询一个字段打印出来
类中方法如下(实际使用可以抽取到工具类中):
控制台显示如下:
工程目录结构如下:
数据库中有两条记录:
最后:这里没有给出具体的代码,主要是考虑到大家只要了解了具体的对象池思想,就可以去自由的使用自己的方式来实现,并不局限于使用某种编程语言的层面,当然本文也只是个人的看法和理解,并不能代表这样就是好的,欢迎大家指正和批评,有任何疑问,都可以交流和探讨。
以上是关于数据库连接池的选择 | 实现的主要内容,如果未能解决你的问题,请参考以下文章