zoukankan      html  css  js  c++  java
  • 开源数据库连接池之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就跟以前不同了,代码如下:

     1 public class JdbcUtils {       //JDBC工具类
     2     private static Properties config;
     3     private static DataSource ds ;
     4     static{
     5         InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");   //将配置文件以流的形式返回
     6         try {
     7             config = new Properties();
     8             config.load(in);  //加载配置文件
     9             ds = BasicDataSourceFactory.createDataSource(config); //根据配置文件创建连接池
    10             
    11         } catch (Exception e) {    
    12             throw new ExceptionInInitializerError(e);
    13         }
    14     }
    15     
    16     public static Connection getConnection() throws SQLException {
    17         return ds.getConnection();   //获取连接
    18     }
    19     
    20     public static void release(Connection conn,Statement st,ResultSet rs) {   //释放资源的代码还是跟以前一样
    21         if(rs!=null) {
    22             try{
    23                 rs.close();
    24             }catch (Exception e) {
    25                 e.printStackTrace();
    26             }
    27             rs = null;
    28         }
    29         if(st!=null) {
    30             try{
    31                 st.close();
    32             }catch (Exception e) {
    33                 e.printStackTrace();
    34             }
    35             st = null;
    36         }
    37         if(conn!=null) {
    38             try{
    39                 conn.close();
    40             }catch (Exception e) {
    41                 e.printStackTrace();
    42             }
    43             conn = null;
    44         }
    45     }
    46 }
    View Code

      通过以上步骤,就已经使用DBCP创建好了一个数据库连接池,很简单吧。所有我们需要修改的功能参数只要在配置文件里面修改即可。这个工具类和以前的工具类大致还是类似的,区别在于不需要人为地使用Class.forname方法加载数据库驱动,所有的一切,如加载数据库驱动,加载数据库URL,加载数据库用户名和密码都只要通过配置文件和DBCP的BasicDataSourceFactory对象即可解决。

      DBCP最大的特点在于可以直接使用Properties对象直接将配置信息通过BasicDataSourceFactory工厂对象的createDataSource方法设置配置文件中的各个参数。

      同样我们看到释放资源的代码跟以前还是相同的,一点都没改变,这也间接地说明了在这个JdbcUtils工具类中的release方法中的Connection的close方法其实根本不会调用,即使我们在别的方法中调用了某个连接Connection对象的close方法,其实也是被DBCP覆写的close方法,这跟我们上一篇自定义数据库连接池的方法是类似的,换句话说,由DBCP跟我们的连接对象根本不是数据库直接提供给我们的Connection对象,而是经过包装或者动态代理设计后的Connection对象,至于使用了哪种增强方式,这个要看是什么开源的数据库连接了,我们可以对上面的代码小小测试一下:

     1 public void testConnection() throws SQLException {
     2         Connection conn = null;
     3         PreparedStatement st = null;
     4         ResultSet rs = null;    
     5         
     6         try{
     7             conn = JdbcUtils.getConnection();
     8             System.out.println(conn);
     9             System.out.println(conn.getClass().getName());
    10         }finally{
    11             JdbcUtils.release(conn, st, rs);
    12         }
    13 }
    View Code

    在控制台上的效果如下:

      

      可以看到DBCP返回给我们的连接其实是一个包装后的Connection对象,不用说也知道这个包装的Connection对象肯定覆写了close方法,以使我们在释放资源时能将连接重新啊返回到DBCP的连接池中。

             

  • 相关阅读:
    一个JavaScript反射使用的例子
    JQuery中的each()的使用
    WebHome < Visualization < Virtual Test Facility
    UsageHdf < Amroc < Virtual Test Facility
    批量去除输出数据文件名前面的"output“
    官网EI数据库更新
    NASA CEA 安装指南
    FORTRAN学习网站
    Ubuntu下批量使用Tecplot的preplot命令对数据进行处理
    FORTRAN和C语言数组循环顺序
  • 原文地址:https://www.cnblogs.com/fjdingsd/p/5273075.html
Copyright © 2011-2022 走看看