数据库连接池设计和实现(Java版本)
1 前言
数据库连接池是目前系统开发必须面对和考虑的问题,原理并不复杂,主要是减少重复连接数据库的代价;在系统中创建预期数量的数据库连接,并将这些连接以一个集合或类似生活中的池一样管理起来,用到的时候直接拿过来使用,用完返回给系统管理;需要注意和主要的难点:
1. 连接池的同步;
2. 连接使用和空闲管理;
3. 连接池满时的管理和响应。
2 连接池应用场景
- 在线系统;
- 高并发和多线程系统;
- 有独立服务管理数据库连接的系统,比如中间件;
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 定义数据库连接配置文件
# 数据库类型
dbType=MySQL
# 数据库驱动类
jdbcDriver=com.mysql.jdbc.Driver
# 数据库url
dbUrl=jdbc:mysql://10.192.168.1:3306/test?useSSL=false
# 数据库用户名
dbUsername=user01
# 数据库密码
dbPassword=Uw@0801%
# 初始化数据库连接
initialConnections=5
# 连接池满后自动扩展连接数
incrementalConnections=5
# 最大数据库连接
maxConnections=30
6.2 连接池的使用
//获得数据���连接池工具类实例
ConnectionPoolUtil pool = ConnectionPoolUtil.getInstance();
//根据db配置文件初始化连接池
pool.initPool("/tmp/dbConnConfig");
/*
* 查询数据
*/
//从连接池中获得连接
Connection conn = pool.getConnection();
DBOperation.read(pool.getConnection(),"select * from partiton_tab_info limit 1",null);
//把连接返回连接池
pool.returnConnection(conn);
/***
* 条件查询
*/
//从连接池中获得连接
conn = pool.getConnection();
String[] filt={"dd01","test001"};
DBOperation.read(pool.getConnection(),"select * from partiton_tab_info where dbname=? and tabname=?",filt);
//把连接返回连接池
pool.returnConnection(conn);
/***
* 插入数据
*/
// 从连接池中获得连接
conn = pool.getConnection();
String[] insert={"hdfs:/tmp/t001.gz",DateUtil.getCurrentDate("yyyy-MM-dd-HH:mm:ss"),"1"};
DBOperation.write(pool.getConnection(),"insert into flume_hdfs_monitor_detail(path,createdate,status) values(?,?,?)",insert);
//把连接返回连接池
pool.returnConnection(conn);
/***
* 关闭连接池中所有连接
*/
pool.closeConnectionPool();
测试输出;
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
2020-09-12 17:15:16.874 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45被创建并加入连接池中...
2020-09-12 17:15:16.874 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
2020-09-12 17:15:16.950 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8被创建并加入连接池中...
2020-09-12 17:15:16.950 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
2020-09-12 17:15:17.016 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_3b209618-1319-4cac-8a88-8571e9dfbc54被创建并加入连接池中...
2020-09-12 17:15:17.016 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
2020-09-12 17:15:17.082 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f被创建并加入连接池中...
2020-09-12 17:15:17.082 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
2020-09-12 17:15:17.152 INFO com.sywu.dao.ConnectionPoolImpl 97 createConnections - 数据库连接:Conn_313319ac-8a7b-463d-a396-155de18915c0被创建并加入连接池中...
2020-09-12 17:15:17.152 INFO com.sywu.dao.ConnectionPoolImpl 102 createConnections - 数据库连接己创建 ....
2020-09-12 17:15:17.153 INFO com.sywu.dao.ConnectionPoolImpl 323 createPool - 数据库连接池创建成功...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.182 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.193 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8 连接被使用...
row:1,column:1,columnName:dbname,value:testdb01
row:1,column:2,columnName:tabname,value:test_tab01
row:1,column:3,columnName:partspec,value:day
row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
2020-09-12 17:15:17.206 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.218 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.229 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_3b209618-1319-4cac-8a88-8571e9dfbc54 连接被使用...
row:1,column:1,columnName:dbname,value:testdb01
row:1,column:2,columnName:tabname,value:test_tab01
row:1,column:3,columnName:partspec,value:day
row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
2020-09-12 17:15:17.242 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.254 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.267 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f 连接被使用...
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.
2020-09-12 17:15:17.280 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
2020-09-12 17:15:17.292 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
2020-09-12 17:15:17.304 WARN com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_313319ac-8a7b-463d-a396-155de18915c0 连接被使用...
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.
2020-09-12 17:15:17.317 INFO com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 连接被返回到连接池中...
2020-09-12 17:15:17.317 INFO com.sywu.dao.ConnectionPoolImpl 409 closeConnectionPool - Connection Pools has 5 connections,closing now...
2020-09-12 17:15:27.318 INFO com.sywu.dao.ConnectionPoolImpl 421 closeConnectionPool - Connection Pools has closed...
数据库连接池设计和实现(Java版本)的更多相关文章
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- python数据库连接池设计
一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...
- 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】
一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- Java jdbc数据库连接池总结!(转)
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
- java配置数据库连接池的方法步骤
java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下 先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...
- java数据库连接池dbcp的使用
近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- JBDC—③数据库连接池的介绍、使用和配置
首先要知道数据库连接(Connection对象)的创建和关闭是非常浪费系统资源的,如果是使用常规的数据库连接方式来操作数据库,当用户变多时,每次访问数据库都要创建大量的Connnection对象,使用 ...
随机推荐
- Quartz.Net的基础使用方法,多任务执行继续扩展
前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...
- Flutter 容器(5) - SizedBox
SizedBox: 两种用法:一是可用来设置两个widget之间的间距,二是可以用来限制子组件的大小. import 'package:flutter/material.dart'; class Au ...
- Storcli64 工具操作指南
1.1 介绍 storcli64可对LSIRAID卡基本操作进行管理,本文主要是对LSIRAID卡常使用到的命令进行介绍 1.2 基本语法 获取控制器号:storcli64 /call show al ...
- 为什么?为什么?Java处理排序后的数组比没有排序的快?想过没有?
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...
- 编译原理LR(0)项目集规范族的构造详解
转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...
- <抽奖奇遇>
时间如同指间沙一般,转眼间一个月就过去了,今天是出去抽奖的日子,这种事情本来性格就淡漠的我不想去参和,怎奈老爸非让我去,我也感到很是无奈.我的运气一直都不好,所以就没抱什么希望,就当是出门去看看热闹 ...
- 阿里云鼠标垫,云中谁寄锦书来,阿里云定制GIT指令集鼠标垫
活动地址 云中谁寄锦书来 活动时间 2020.8.19-8.28 奖品 必得,每日200份,共2000份 参考答案 tips:单选选择以上都是,多选就是全选 云效DevOps包含哪些产品- ABCDE ...
- centos7.8 安装部署 k8s 集群
centos7.8 安装部署 k8s 集群 目录 centos7.8 安装部署 k8s 集群 环境说明 Docker 安装 k8s 安装准备工作 Master 节点安装 k8s 版本查看 安装 kub ...
- ubuntu ARM 源配置
cat /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main deb-src http://mir ...
- 实用教程!SPSSAU验证性因子分析思路总结
验证性因子分析,是用于测量因子与测量项(量表题项)之间的对应关系是否与研究者预测保持一致的一种研究方法.尽管因子分析适合任何学科使用,但以社会科学居多. 目前有很多软件都可以非常便利地实现验证性因子分 ...