数据库连接池的选择

新年的第一个工作日,愿我们的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.2abstract PoolBase接下来实现一个池基类(基于PooledObjectFactory和GenericObjectPool)如对具体实现没有概念,可以参考pool2 api的实现。

PoolBase池基类的结构如下:

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

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

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

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

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

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

3.2实现JdbcConnectionFactory

JdbcConnectionFactory类结构如下:

3.3实现jdbcConnectionPool

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

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

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

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

控制台显示如下:

工程目录结构如下:

数据库中有两条记录:

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

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏步履前行

windows下面安装Python和pip终极教程

  在大二的时候接触过一段时间的Python,最近又开始玩起了这门语言。总的来说,个人很喜欢Python的语言风格,但是这门语言对于windows并不算很友好,...

1804
来自专栏云计算教程系列

【基础干货】Linux Shell基础教程

shell,也称为“命令行界面”或“CLI”,是与远程Linux服务器交互的主要方法。shell是一个丰富的界面,用于处理文件,管理系统和编写常见任务脚本。如果...

1504
来自专栏菜鸟程序员

Android 调试桥

1943
来自专栏JavaEdge

zookeeper分布式锁1 分布式锁的概念与数据最终不一致性的场景zookeeper分布式锁小结

随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式...

9391
来自专栏青青天空树

tomcat远程调试javaweb

  当把一个本地项目部署到远程服务器后有可能出现意想不到错误,这个时候通过远程调试能够更清楚的找到bug所在位置。

6341
来自专栏linux驱动个人学习

Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。

4305
来自专栏xingoo, 一个梦想做发明家的程序员

Oozie分布式工作流——Action节点

前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点。Action节点有一些比较通用的特性: Action节点是远程的 ...

2306
来自专栏腾讯云TStack专栏

一个集技术与才华于一身的95后小鲜肉,为你分享rabbitmq集群操作手法

关于作者 ? ? 在rabbitmq集群操作或者搭建的时候,常常会因为对于集群的不熟练而导致各种异常错误,常见的有绑定了浮动ip没有绑定实体ip导致,页面...

1161
来自专栏小明plus

在2018年如何优雅的开发一个typescript语言的npm包?

很多时候,我们可能想要用 typescript 语言来创建一些模块,并提交到 npm 供别人使用,

1.3K10
来自专栏IMWeb前端团队

windows 上优雅的安装 node 和 npm

我一直觉得我掌握的这份优雅是被许多人所知道了,直到我发现小伙伴们都下载 .msi 来装 node ,我心中的优雅感终于压制不住。 .msi 安装 windows...

2147

扫码关注云+社区

领取腾讯云代金券