开源数据库连接池之DBCP
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Apache公司的的DBCP数据库连接池。
前面一篇博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式。这样能减少数据库创建连接的消耗。正是由于数据库连接池的思想非常重要,所以市面上也有很多开源的数据库连接池供我们使用。主要有以下三个:
DBCP数据库连接池
C3P0 数据库连接池
Tomcat内置的数据库连接池(DBCP)
本篇主要讲述DBCP数据库连接池的使用,关于另外两个数据库连接池的用法请看《开源数据库连接池之C3P0》 、《开源数据库连接池之Tomcat内置连接池》 。如果我们使用这些开源的数据库连接池,我们就可以省略像前一篇博客中自己创建数据库连接池的步骤,这样会省略我们很多事。
DBCP是Apache软件基金组织下的开源连接池的实现,使用DBCP数据源,需要在我们的web工程中添加以下两个开源jar包:
·Commons-dbcp.jar
·Commons-pool.jar
到现在为止,DBCP和POOL已经都已经升为DBCP2和POOL2,DBCP2.x和DBCP1.x并不兼容,用户应该注意在使用DBCP配置文件上的选项可能发生了改变(如maxAction变成了maxTotal)等等。
对于使用开源数据库连接池,最重要的就是如何设置配置文件中的配置信息,Apache官网中提供了最新版的DBCP2.1.1的配置关键词和其作用:http://commons.apache.org/proper/commons-dbcp/configuration.html 我们可以从这个网页中的表格里拾取我们需要的有用的配置参数。
但在本例中我并不打算使用最新版的DBCP2,而是使用DBCP1.4。
例:简单地使用DBCP数据库连接池
创建工程JdbcPoolLearning,添加我们的commons-dbcp-1.4.jar包和commons-pool-1.6.jar包,当然别忘了数据库驱动jar包:

接着在工程的【src】目录下放置我们的配置文件dbcpconfig.properties,配置文件内容如下:
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root #<!-- 初始化连接 -->
initialSize=10 #最大连接数量
maxActive=50 #<!-- 最大空闲连接 -->
maxIdle=20 #<!-- 最小空闲连接 -->
minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED
上面是配置文件中的配置参数,当然我们只选取部分的参数即可满足我们demo的演示,如果在实际开发过程中需要使用到DBCP更多的功能,可以自己再在这份配置文件上添加上配置参数,配置参数可以从http://commons.apache.org/proper/commons-dbcp/configuration.html该网站上获取,但要注意这是DBCP2版本的配置参数,部分和DBCP1.x的参数命名不同。
通常我们会将获取连接作为一个工具类,如《JDBC操作数据库的学习(2)》中的JdbcUtils工具类一样,但我们知道,现在我们要想获取连接不再是直接从数据库创建而来,而是从连接池中获取,因此JdbcUtils工具类获取连接的方法getConnection就跟以前不同了,代码如下:
public class JdbcUtils { //JDBC工具类
private static Properties config;
private static DataSource ds ;
static{
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); //将配置文件以流的形式返回
try {
config = new Properties();
config.load(in); //加载配置文件
ds = BasicDataSourceFactory.createDataSource(config); //根据配置文件创建连接池
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection(); //获取连接
}
public static void release(Connection conn,Statement st,ResultSet rs) { //释放资源的代码还是跟以前一样
if(rs!=null) {
try{
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null) {
try{
st.close();
}catch (Exception e) {
e.printStackTrace();
}
st = null;
}
if(conn!=null) {
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}
通过以上步骤,就已经使用DBCP创建好了一个数据库连接池,很简单吧。所有我们需要修改的功能参数只要在配置文件里面修改即可。这个工具类和以前的工具类大致还是类似的,区别在于不需要人为地使用Class.forname方法加载数据库驱动,所有的一切,如加载数据库驱动,加载数据库URL,加载数据库用户名和密码都只要通过配置文件和DBCP的BasicDataSourceFactory对象即可解决。
DBCP最大的特点在于可以直接使用Properties对象直接将配置信息通过BasicDataSourceFactory工厂对象的createDataSource方法设置配置文件中的各个参数。
同样我们看到释放资源的代码跟以前还是相同的,一点都没改变,这也间接地说明了在这个JdbcUtils工具类中的release方法中的Connection的close方法其实根本不会调用,即使我们在别的方法中调用了某个连接Connection对象的close方法,其实也是被DBCP覆写的close方法,这跟我们上一篇自定义数据库连接池的方法是类似的,换句话说,由DBCP跟我们的连接对象根本不是数据库直接提供给我们的Connection对象,而是经过包装或者动态代理设计后的Connection对象,至于使用了哪种增强方式,这个要看是什么开源的数据库连接了,我们可以对上面的代码小小测试一下:
public void testConnection() throws SQLException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
System.out.println(conn);
System.out.println(conn.getClass().getName());
}finally{
JdbcUtils.release(conn, st, rs);
}
}
在控制台上的效果如下:

可以看到DBCP返回给我们的连接其实是一个包装后的Connection对象,不用说也知道这个包装的Connection对象肯定覆写了close方法,以使我们在释放资源时能将连接重新啊返回到DBCP的连接池中。
开源数据库连接池之DBCP的更多相关文章
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- 开源数据库连接池之C3P0
本篇介绍几种开源数据库连接池,同时重点讲述如何使用C3P0数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数据库创建连接的消 ...
- JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术
本文目录: 1.应用程序直接获取连接的缺点(图解) 2.使用数据库连接池优化程序性能(图解) 3.可扩展增强某个类方法的功能的三种方式 4.自定 ...
- JDBC(三)数据库连接池(DBCP、C3P0)
前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...
- Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用
DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...
- [javaEE] 开源数据库连接池
一些开源组织提供了数据源的独立实现: DBCP数据库连接池 C3P0数据库连接池 Apache Tomcat内置的连接池 DBCP连接池 apache提供的连接池实现,需要导入common-dbcp. ...
- 数据库连接池(DBCP:为数据统一建立一个缓冲池,现在企业开发使用)
数据库连接池:(里面放了许多连接数据的链接,负责分配,管理,释放数据库连接,可重复使用连接,而不新建 )为数据统一连接建立一个缓冲池,放好了一定数据库连接,使用时在缓冲池里面拿,用完之后再还给缓冲池 ...
- Java使用独立数据库连接池(DBCP为例)
目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源 ...
- 【MySQL】自定义数据库连接池和开源数据库连接池的使用
数据库连接池的概念 数据库连接背景 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性 ...
随机推荐
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动
马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...
- bash: ./configure: 权限不够
linux下运行一个文件时 提示权限不够,说明这个文件没有可执行权限 我们可以在属性里面手动为这个文件加上可执行权限也可以使用命令的方式 命令方式: 例如: bash: ./configure: ...
- CSS块元素与内联元素(转)
为什么<a><span>这种标签定义width,height等CSS属性时会发现完全不生效? 因为它们不是容器,它们是内联元素,不是块元素 CSS 块元素与内联元素 关键字: ...
- linux下磁盘分区
转自于:http://pengyl.blog.51cto.com/5591604/1193963 命令:fdisk 功能:查看磁盘使用情况和分割磁盘 使用方法: 一.在 ...
- A. Case of the Zeros and Ones----解题报告
A. Case of the Zeros and Ones Description Andrewid the Android is a galaxy-famous detective. In his ...
- HDU2527:Safe Or Unsafe(哈弗曼树)
Problem Description Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当 ...
- FileDescriptor
FileDescriptor 在java中的java.io包下面 public final class FileDescriptor { ... } 官方的解释: 文件描述符类的实例用作与基础机器有关 ...
- ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper
ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper 监控 master/slave 需要使用zk的临时节点 ...
- Mybatis3 框架理解
最近工作比较闲,维护一个政府机关的短信发送平台,大部分业务逻辑都在Oracle数据库上,但自己明明应聘的是Java开发啊!!!整天写存储过程的我还是有一颗写高级语言的心啊!!!好吧!!!先找个数据库方 ...
- 180China丨the Agency for Brand Engagement and Experience
180China丨the Agency for Brand Engagement and Experience Welcome to 180. Welcome to Creativity. Thank ...