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 ...
随机推荐
- EasyEarth三维可视化解决方案——智慧林业
智慧林业 智能巡管监护 护林员信息查询 护林员管护范围查询 护林员报警.采集数据查看 样点.样线管理 其它功能模块 ●一键考勤打卡 ●面积测量 ●任务公告发布 ●实时电量监控 ●一键报警功能 ●北斗短 ...
- hdfs、yarn集成kerberos
1.kdc创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...
- OpenFOAM——具有压差且平行平板间具有相对运动流动
本算例翻译整理自:http://the-foam-house5.webnode.es/products/chapter-1-plane-parallel-plates-case/ 这个算例中两平板间具 ...
- 再见,Eclipse。
阅读本文大概需要 5 分钟. 来源:cnblogs.com/ouyida3/p/9901312.html 最近,改用了 IDEA,同事都说我投敌了.当然,这些同事都是和我一样的“老”程序员.不说毕业生 ...
- how does SELECT TOP works when no order by is specified?
how does SELECT TOP works when no order by is specified? There is no guarantee which two rows you ge ...
- 大div套多个小div,怎样设置外div的高度自适应?
在最后一个div 后面加上 overflow:hidden;如下: <div style="width:580px; height:auto; margin:0 auto; <d ...
- 平时常说的ThreadLocal,今天就彻底解决它
前言 一.了解ThreadLocal的作用 二.ThreadLocal简单使用 三.ThreadLocal原理 3.1 ThreadLocal的存取过程 3.2 探究ThreadLocalMap对象 ...
- ArrayList: java之ArrayList详细介绍(转)
1 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List ...
- 如何下载官网最新版 win10 系统?
如何下载官网最新版 win10 系统?步骤: 一. 下载 遨游浏览器 将UA切换成,手机访问:推荐 UC浏览器,UA设置: Mozilla/5.0 (Linux; U; Android 8.0.0; ...
- boost中g++ 链接undefined reference to `boost::system::generic_category()问题
编译错误如下: g++ -std=c++11 tcp_session.cpp tcp_server.cpp test.cpp -o test -pthread/tmp/ccv4rZkD.o: In ...