DBCP数据库连接池初探
1、 概述
数据库连接是很“宝贵的”,如果每次获取Connection都去创建数据库连接,使用之后就断开,再次使用又重新创建,程序效率是很低的。因为Socket连接的建立很消耗资源。
所以需要数据库连接池,数据库连接池也被称为数据源即DataSource,JAVA中为了使用者更加规范的编写数据源类,定义了java.sql.DataSource接口,如果我们要编写自己的连接池,就要实现这个接口。
程序通过连接池预先同数据库建立一些连接,放在内存中,需要数据库连接时直接到连接池中取一个就行,用完后再放回去。
该接口声明了两个获取数据库连接的方法
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password) throws SQLException;
}
2、DBCP 数据源概述
DBCP(DataBase Connection Pool)由Apache开发,可以让程序自动管理数据库连接的释放和断开。
需要使用的jar包:commons-dbcp-1.4.jar、commons-pool-1.5.4.jar、commons-logging-1.0.4.jar、commons-collections-3.1.jar
重要的配置参数:
| driverClassName | 数据库驱动 |
| url | 数据库连接url |
| username | 数据库连接用户名 |
| password | 数据库连接密码 |
| initialSize | 初始连接数量 |
| maxActive | 最大活跃连接数量 |
| maxIdle | 最大空闲连接数量 |
| minIdle | 最小空闲连接数量 |
| maxWaitMillis | 在抛出异常之前等待的最大毫秒数(当没有可用的连接时),默认-1无限期地等待 |
| validationQuery | 验证连接时使用的SQL |
| testOnCreate | 连接创建时验证 |
| testOnBorrow | 连接获取时验证 |
| testOnReturn | 连接归还时验证 |
| testWhileIdle | 是否验证空闲连接,默认false不验证。 如果一个对象无法验证,将从池中删除 |
| timeBetweenEvictionRunsMillis | 运行空闲对象删除线程的时间间隔,单位为毫秒,默认为-1即不执行任务 |
| numTestsPerEvictionRun | 空闲对象删除线程每次运行时检查的对象数量(如果有的话),默认3个 |
| minEvictableIdleTimeMillis | 在空闲对象删除线程可以删除连接之前,连接可以在池中空闲的最少时间(如果有的话),默认1000 * 60 * 30 |
| maxConnLifetimeMillis | 连接的最长寿命(以毫秒为单位)。超过此时间后,连接将在下一次激活、钝化或验证测试时失败。0或更小意味着连接具有无限寿命 |
| removeAbandonedTimeout | Timeout in seconds before an abandoned connection can be removed |
3、 设计思路
1) 在jdbc.properties文件配置数据源实现类类型,以及该数据源的属性信息;
2) 在DBUtil工具类中解析配置文件,获取到使用的数据源类型,并通过反射实例化;
3) 使用beanutils框架给实例化的数据源对象注入属性,需要使用到commons-beanutils-1.9.3.jar框架;
4) 修改getConnection方法从数据源获取连接
之所以这样做,是为了程序代码和具体数据源实现类的解耦,当不再使用DBCP改用C3P0时,我们可以通过修改jdbc.properties配置文件而不再需要修改程序代码。
4、 配置 jdbc.properties
##### DBCP Configuration ##### dataSourceClassName=org.apache.commons.dbcp.BasicDataSource driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false username=system
password=123456 initialSize=1
maxActive=10
maxIdle=5
minIdle=2 maxWaitMillis=-1
validationQuery=select 1
testWhileIdle=true
timeBetweenEvictionRunsMillis=60000
numTestsPerEvictionRun=3
minEvictableIdleTimeMillis=60000
softMinEvictableIdleTimeMillis=60000
maxConnLifetimeMillis=300000
removeAbandonedTimeout=300
5、DBUtil 工具类
public class DBUtil {
/**
* 数据源对象
*/
private static DataSource ds;
private static Properties prop = new Properties();
static {
try {
// 读取加载jdbc配置文件
prop.load(DBUtil.class.getClassLoader().getResourceAsStream(
"jdbc.properties"));
// 获取数据源实现类类型
String dataSourceClassName = prop
.getProperty("dataSourceClassName");
// 实例化数据源实现类
Class<?> clazz = Class.forName(dataSourceClassName);
ds = (DataSource) clazz.newInstance();
prop.remove("dataSourceClassName");
// 为数据源注入属性
Map<String, Object> p = new HashMap<String, Object>();
for (Object key : prop.keySet()) {
p.put(key.toString(), prop.get(key));
}
BeanUtils.populate(ds, p);
} catch (IOException e) {
throw new RuntimeException("加载JDBC配置失败", e);
} catch (ClassNotFoundException e) {
throw new RuntimeException("数据源实现类未找到", e);
} catch (InstantiationException e) {
throw new RuntimeException("创建数据源实现类对象失败", e);
} catch (IllegalAccessException e) {
throw new RuntimeException("创建数据源实现类对象失败", e);
} catch (InvocationTargetException e) {
throw new RuntimeException("数据源属性注入时失败", e);
}
}
/**
* 从数据源中获取一个数据库连接
*
* @return 数据库连接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
DBCP数据库连接池初探的更多相关文章
- 【Java EE 学习 16 上】【dbcp数据库连接池】【c3p0数据库连接池】
一.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: package day16.utils; import java.io.IOException; import java.lang.ref ...
- DBCP数据库连接池
在用JDBC连接数据库的时候,需要创建对数据库的连接,这样才能执行后续的操作.然而,这样做有两个问题: 数据库允许的连接个数有限 创建连接的过程需要消耗内存和时间 所以,JDBC引入了连接池的概念.也 ...
- 一次项目实践中DBCP数据库连接池性能优化
关于数据库连接池DBCP的关注源于刚刚结束的一轮测试,测试内容是衡量某Webserver服务创建用户接口的性能.这是一款典型的tomcat应用,使用的测试工具是Grinder.DBCP作为tomcat ...
- DBCP数据库连接池的使用
DBCP的简单介绍: DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由apache开发通过数据库连接池可以让程序自动管理数据库连接的释放和断开 ...
- DBCP数据库连接池的简单使用
0.DBCP简介 DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目.DBCP通过连接池预先同数据库建立一些连接放在内存中( ...
- java基础之JDBC六:DBCP 数据库连接池简介
我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...
- DBCP数据库连接池原理分析
在比较大的项目中,需要不断的从数据库中获取数据,Java中则使用JDBC连接数据库,但是获取数据库的连接可是相当耗时的操作,每次连接数据库都获得 .销毁数据库连接,将是很大的一个开销.为了解决这种开销 ...
- 03_dbcp数据源依赖jar包,DBCP中API介绍,不同过dbcp方式使用dbcp数据库连接池,通过配置文件使用dbcp数据库连接池
DBCP数据源 使用DBCP数据源,需要导入两个jar包 Commons-dbcp.jar:连接池的实现 Common-pool.jar:连接池实现的依赖库. 导入mysql的jar包. DBC ...
- dbcp数据库连接池的java实现
1.准备 导入jar包 commons-dbcp-1.4.jar commons-pool-1.3.jar 数据库驱动包,如:mysql-connector-java-5.1.28-bin.jar 2 ...
随机推荐
- 网站性能测试工具 webbench 的安装和使用-linux
1.webbench的下载和安装 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz sudo tar xvf we ...
- PHP cURL 超时设置 CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT 的区别
PHP cURL 的超时设置有两个 CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT,他们的区别是: CURLOPT_CONNECTTIMEOUT 用来告诉 PHP 在 ...
- sql查询最近7天数据(以年-月-日结果展示)
sql代码如下: , 查询结果如下:
- AIX 系统参数配置
AIX 系统参数配置 原创 Linux操作系统 作者:fanhongjie 时间:2008-05-08 22:46:37 540 0 AIX内核属于动态内核,核心参数基本上可以自动调整,因此当系统安装 ...
- EasyNVR智能云终端硬件盒子x86版自我维护之摄像机网页直播系统基础运维
背景分析 随着EasyNVR软件为越来越多的用户接受和使用,我们也致力于用户的需求收集和需求的调研,发现一部分用户有关于硬件设备的需求,加之我们推出的免费产品EasyNVS云管理平台,可以说用户自己搭 ...
- [LeetCode] 260. Single Number III 单独数 III
Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...
- 后会有期,江湖再见!(WondersGroup)
很高兴能和大家一路走来,一如既往的做好并做完本职工作后,今儿我要离开了,本想着悄无声息地离开,但是为了解决走了还被微信艾特和私聊找我处理问题的潜在风险,我决定在此正式的和大家说一声再见!哈哈,It's ...
- 分布式唯一ID生成常用方案
1. 使用JAVA的UUID生成 算法的核心思想是结合机器的网卡.当地时间.一个随记数来生成UUID. 优点:本地生成,生成简单,性能好,没有高可用风险 缺点:长度过长,字母和数字组合,存储冗余,且无 ...
- Redis专栏
后端开发都应该掌握的Redis基础 Redis实用监控工具一览
- Java中BIO,NIO,AIO的理解
在高性能的I/O体系设计中,有几个概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...