1 前言

数据库连接池是目前系统开发必须面对和考虑的问题,原理并不复杂,主要是减少重复连接数据库的代价;在系统中创建预期数量的数据库连接,并将这些连接以一个集合或类似生活中的池一样管理起来,用到的时候直接拿过来使用,用完返回给系统管理;需要注意和主要的难点:
1. 连接池的同步;
2. 连接使用和空闲管理;
3. 连接池满时的管理和响应。

2 连接池应用场景

  1. 在线系统;
  2. 高并发和多线程系统;
  3. 有独立服务管理数据库连接的系统,比如中间件;

3 设计

ConnectionPool 定义连接池的结构、功能信息;
PooledConnection 连接池内的连接对象数据结构;
ConnectionPoolImpl 连接池内部结构和实现,创建/关闭/获取连接;
ConnectionPoolUtil 连接池工具类,对外开放;
DBOperation 数据库操作(read/write)简单实现类;

4 开发测试软件版本

JDK 1.8,MySQL 5.7.30

5 源码

https://github.com/LanstonWu/DBConnectionPool

6 使用示例

6.1 定义数据库连接配置文件

  1. # 数据库类型
  2. dbType=MySQL
  3. # 数据库驱动类
  4. jdbcDriver=com.mysql.jdbc.Driver
  5. # 数据库url
  6. dbUrl=jdbc:mysql://10.192.168.1:3306/test?useSSL=false
  7. # 数据库用户名
  8. dbUsername=user01
  9. # 数据库密码
  10. dbPassword=Uw@0801%
  11. # 初始化数据库连接
  12. initialConnections=5
  13. # 连接池满后自动扩展连接数
  14. incrementalConnections=5
  15. # 最大数据库连接
  16. maxConnections=30

6.2 连接池的使用

  1. //获得数据���连接池工具类实例
  2. ConnectionPoolUtil pool = ConnectionPoolUtil.getInstance();
  3. //根据db配置文件初始化连接池
  4. pool.initPool("/tmp/dbConnConfig");
  5. /*
  6. * 查询数据
  7. */
  8. //从连接池中获得连接
  9. Connection conn = pool.getConnection();
  10. DBOperation.read(pool.getConnection(),"select * from partiton_tab_info limit 1",null);
  11. //把连接返回连接池
  12. pool.returnConnection(conn);
  13. /***
  14. * 条件查询
  15. */
  16. //从连接池中获得连接
  17. conn = pool.getConnection();
  18. String[] filt={"dd01","test001"};
  19. DBOperation.read(pool.getConnection(),"select * from partiton_tab_info where dbname=? and tabname=?",filt);
  20. //把连接返回连接池
  21. pool.returnConnection(conn);
  22. /***
  23. * 插入数据
  24. */
  25. // 从连接池中获得连接
  26. conn = pool.getConnection();
  27. String[] insert={"hdfs:/tmp/t001.gz",DateUtil.getCurrentDate("yyyy-MM-dd-HH:mm:ss"),"1"};
  28. DBOperation.write(pool.getConnection(),"insert into flume_hdfs_monitor_detail(path,createdate,status) values(?,?,?)",insert);
  29. //把连接返回连接池
  30. pool.returnConnection(conn);
  31. /***
  32. * 关闭连接池中所有连接
  33. */
  34. pool.closeConnectionPool();

测试输出;

  1. 2020-09-12 17:15:16.347 INFO com.sywu.dao.ConnectionPoolImpl 261 <init> - dbType:MySQL,dbUrl:jdbc:mysql://10.192.168.1:3306/test?useSSL=false,dbUsername:user01,initialConnections:5,incrementalConnections:5,maxConnections:30
  2. 2020-09-12 17:15:16.874 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45被创建并加入连接池中...
  3. 2020-09-12 17:15:16.874 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
  4. 2020-09-12 17:15:16.950 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8被创建并加入连接池中...
  5. 2020-09-12 17:15:16.950 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
  6. 2020-09-12 17:15:17.016 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_3b209618-1319-4cac-8a88-8571e9dfbc54被创建并加入连接池中...
  7. 2020-09-12 17:15:17.016 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
  8. 2020-09-12 17:15:17.082 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f被创建并加入连接池中...
  9. 2020-09-12 17:15:17.082 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
  10. 2020-09-12 17:15:17.152 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_313319ac-8a7b-463d-a396-155de18915c0被创建并加入连接池中...
  11. 2020-09-12 17:15:17.152 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
  12. 2020-09-12 17:15:17.153 INFO com.sywu.dao.ConnectionPoolImpl 323 createPool - 数据库连接池创建成功...
  13. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  14. 2020-09-12 17:15:17.182 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
  15. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  16. 2020-09-12 17:15:17.193 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8 连接被使用...
  17. row:1,column:1,columnName:dbname,value:testdb01
  18. row:1,column:2,columnName:tabname,value:test_tab01
  19. row:1,column:3,columnName:partspec,value:day
  20. row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
  21. 2020-09-12 17:15:17.206 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
  22. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  23. 2020-09-12 17:15:17.218 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
  24. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  25. 2020-09-12 17:15:17.229 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_3b209618-1319-4cac-8a88-8571e9dfbc54 连接被使用...
  26. row:1,column:1,columnName:dbname,value:testdb01
  27. row:1,column:2,columnName:tabname,value:test_tab01
  28. row:1,column:3,columnName:partspec,value:day
  29. row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
  30. 2020-09-12 17:15:17.242 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
  31. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  32. 2020-09-12 17:15:17.254 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
  33. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
  34. 2020-09-12 17:15:17.267 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f 连接被使用...
  35. sql:com.mysql.jdbc.JDBC42PreparedStatement@5ae50ce6: insert into flume_hdfs_monitor_detail(path,createdate,status) values('hdfs:/tmp/t001.gz','2020-09-12-17:15:17','1'),insert or update:1 rows.
  36. 2020-09-12 17:15:17.280 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
  37. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
  38. 2020-09-12 17:15:17.292 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
  39. row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
  40. 2020-09-12 17:15:17.304 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_313319ac-8a7b-463d-a396-155de18915c0 连接被使用...
  41. sql:com.mysql.jdbc.JDBC42PreparedStatement@be64738: update flume_hdfs_monitor_detail set status='2',closedate='2020-09-12-17:15:17' where path='hdfs:/tmp/t001.gz' and status=1,insert or update:1 rows.
  42. 2020-09-12 17:15:17.317 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
  43. 2020-09-12 17:15:17.317 INFO com.sywu.dao.ConnectionPoolImpl 409 closeConnectionPool - Connection Pools has 5 connections,closing now...
  44. 2020-09-12 17:15:27.318 INFO com.sywu.dao.ConnectionPoolImpl 421 closeConnectionPool - Connection Pools has closed...

数据库连接池设计和实现(Java版本)的更多相关文章

  1. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  2. python数据库连接池设计

    一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...

  3. 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】

    一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...

  4. Java数据库连接池

    转载过来的,最近在做一个小网站,准备使用这种方法.     Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...

  5. Java jdbc数据库连接池总结!(转)

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  6. java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下   先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...

  7. java数据库连接池dbcp的使用

    近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式 ...

  8. java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  9. JBDC—③数据库连接池的介绍、使用和配置

    首先要知道数据库连接(Connection对象)的创建和关闭是非常浪费系统资源的,如果是使用常规的数据库连接方式来操作数据库,当用户变多时,每次访问数据库都要创建大量的Connnection对象,使用 ...

随机推荐

  1. C#LeetCode刷题之#844-比较含退格的字符串​​​​​​​(Backspace String Compare)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...

  2. C#LeetCode刷题之#598-范围求和 II​​​​​​​(Range Addition II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3881 访问. 给定一个初始元素全部为 0,大小为 m*n 的矩阵 ...

  3. LeetCode 873. 最长的斐波那契子序列的长度 题目详解

    题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...

  4. ES读写流程

    简述ES的写流程,GET读取数据流程和Search搜索数据流程. ES的读写流程主要是协调节点,主分片节点.副分片节点间的相互协调. ES的读取分为GET和Search两种操作.GET根据文档id从正 ...

  5. 火题小战 C. 情侣?给我烧了!

    火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...

  6. HBA卡常用命令

    HBA卡信息查看 查看对应的PCI设备lspci | grep LSI 如下:对应的HBA卡命令为sas3ircu 如下:对应的HBA卡使用sas2ircu 查看LSI控制器类型和型号 sas2irc ...

  7. MSDN 无法显示的问题 2010-03-21 21:08

    MSDN 无法显示的问题regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Help\hxds.dll" .试图运行项 ...

  8. 编写有提示的listbox控件 2008-06-29 17:13

    在MFC中几乎所有的控件都有信息提示,而惟有listbox却没有这样的一个功能,每当我们把鼠标移到listbox上控件时,啥玩意儿都没有是不是很气馁啊,所以我今天特地写了一个简单的有提示的listbo ...

  9. ANALYZE导致的阻塞问题分析

    背景 问题描述 DBA同学收到qps大量下降的告警,qps从2w下降到1w,然后又自动恢复了. 基于Analysis Report信息,发现有很多 STATE:Waiting for table fl ...

  10. OpenStack虚拟机virtaulinterfance 网络设备在libvirt的代码梳理

    nova创建虚机网卡实际设备的代码调用流程为 _create_domain_and_network---->plug_vifs-->LibvirtGenericVIFDriver.plug ...