本篇介绍几种开源数据库连接池,同时重点讲述如何使用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的更多相关文章

  1. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

  2. 开源数据库连接池之C3P0

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用C3P0数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数据库创建连接的消 ...

  3. JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术

    本文目录:        1.应用程序直接获取连接的缺点(图解)        2.使用数据库连接池优化程序性能(图解)        3.可扩展增强某个类方法的功能的三种方式        4.自定 ...

  4. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  5. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  6. [javaEE] 开源数据库连接池

    一些开源组织提供了数据源的独立实现: DBCP数据库连接池 C3P0数据库连接池 Apache Tomcat内置的连接池 DBCP连接池 apache提供的连接池实现,需要导入common-dbcp. ...

  7. 数据库连接池(DBCP:为数据统一建立一个缓冲池,现在企业开发使用)

    数据库连接池:(里面放了许多连接数据的链接,负责分配,管理,释放数据库连接,可重复使用连接,而不新建  )为数据统一连接建立一个缓冲池,放好了一定数据库连接,使用时在缓冲池里面拿,用完之后再还给缓冲池 ...

  8. Java使用独立数据库连接池(DBCP为例)

    目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源 ...

  9. 【MySQL】自定义数据库连接池和开源数据库连接池的使用

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

随机推荐

  1. (3)选择元素——(2)文档对象模型(The Document Object Model)

    One of the most powerful aspects of jQuery is its ability to make selecting elements in the DOM easy ...

  2. keytool 生成 Android SSL 使用的 BKS

    我是在Mac(JDK 1.6) 环境下生成的,Windows  也应该通用; 首先要从CA那里申请来签名的证书,我的是crt格式的; 然后使用如下命令,对应的BcProvider 是 bcprov-e ...

  3. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  4. 基于visual Studio2013解决算法导论之013基数排序

     题目 基数排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  5. Android动态设定GridView的高度,固定column,实现高度自适应

    动态设定GridView的高度,固定column,根据gridview中的item个数设定高度: 调用以下方法: public static void setListViewHeightBasedOn ...

  6. mysql入门记录

    mysql -h localhost(or ID) -u root -p show databases; create database <数据库名>: drop database < ...

  7. java--多线程之Thread继承

    多线程,是java的特殊机制.所谓线程就是程序执行的流程.“多线程”就是可以在同一时刻能够执行多个程序块(注意,是程序块,而不是程序),这样一来就可以使得程序的执行速度大大增加. package Te ...

  8. DockerCon 2016

    DockerCon 2016 – 微软带来了什么?   根据Forrester的调查,接近半数的企业CIO在考虑IT架构的时候更乐于接受开源方案,这主要是基于低成本,避免供应商锁定和敏捷的需求:同时另 ...

  9. QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)

    新版本的QQ聊天窗口可以实现拖动,分离出新的窗口.浏览器等软件也可以实现类似操作.所以心血来潮想用Qt实现类似的功能.想用QTabWidget直接实现是很难的,仔细阅读源码,发现QTabWidget内 ...

  10. Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)

    QThread实例代表一个线程,我们可以重新实现QThread::run(),要新建一个线程,我们应该先继承QThread并重新实现run()函数. 需要注意的是: 1.必须在创建QThread对象之 ...