三种数据库连接池的配置及使用(For JDBC)

DBCP

一、导包

Apache官网下载DBCP包,导入两个包路径如下:

commons-dbcp-1.4-bin\commons-dbcp-1.4\commons-dbcp-1.4.jar:连接池的实现

commons-pool-1.5.6-bin\commons-pool-1.5.6\commons-pool-1.5.6.jar:连接池实现的依赖库

CSDN上jar包的下载地址:http://download.csdn.NET/detail/u012802702/9491642

二、代码示例:

方式一:使用BasicDataSource 通过方法设置连接参数。

//获取BasicDataSource并配置,开始....
        BasicDataSource source = new BasicDataSource();
    source.setDriverClassName("com.mysql.jdbc.Driver");
    source.setUrl("jdbc:mysql:///dbcptest");
    source.setUsername("root");
    source.setPassword("root");
//获取BasicDataSource并配置,结束......
    try {
            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while (rs.next()) {
                String name = rs.getString("name");
                System.out.println(name);
            }
     } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    ps = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }

其中的Close方法是被改写过得,及不会真正的将连接关闭,而是将其放回到连接池中,对于所有的数据源一般都会改写此方法(使用修饰)。

方式二:使用BasicDataSourceFactory +配置文件

 try {               //获取并配置DataSource开始
            Properties prop = new Properties();
            prop.load(new FileReader("dbcp.properties"));
            BasicDataSourceFactory factory = new BasicDataSourceFactory();
            DataSource source = factory.createDataSource(prop);
        //获取并配置DataSource,结束
            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while (rs.next()) {
                String name = rs.getString("name");
                System.out.println(name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    ps = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }

配置文件dbcp.properties(注配置文件中的参数的名称固定):

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///dbcptest
user=root
password=root

另:配置文件中除了可以配置以上4个数据库连接的必须信息外,还可以配置其他的参数,官方较完整的配置文件的参考如下:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

#<!-- 初始化创建的连接数,当不够时再去创建 -->
initialSize=10

#最大连接数量,连接数连不能超过该值
maxActive=50

#<!-- 最大空闲连接,当空闲连接超过该值时就挨个关闭多余的连接,但不能小于minldle -->
maxIdle=20

#<!-- 最小空闲连接,空闲连接的最下值 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒,当连接超过该时间便认为其实空闲连接 -->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

C3P0

一、导包

下载C3p0数据源的jar包导入如下jar包:

Lib\c3p0-0.9.1.2.jar

CDSN的下载地址:http://download.csdn.Net/detail/u012802702/9491641

二、示例

方式一:使用代码配置参数

try{
            ComboPooledDataSource source = new ComboPooledDataSource();
            source.setDriverClass("com.mysql.jdbc.Driver");
            source.setJdbcUrl("jdbc:mysql:///day11");
            source.setUser("root");
            source.setPassword("root");

            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while(rs.next()){
                String name = rs.getString("name");
                System.out.println(name);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    rs = null;
                }
            }
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    ps = null;
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    conn = null;
                }
            }
        }
    }

方式二:配置文件的方式加载数据库驱动信息

C3p0的使用较为简单,通常来说只要在src目录下添加一个c3p0的配置文件,在程序中使用一句代码

1)ComboPooledDataSource source = new ComboPooledDataSource()使用配置文件中的默认配置<default-config>,或者

2)ComboPooledDataSource source = new ComboPooledDataSource(“配置文件中name-config的名称”)使用配置文件中的其他配置

默认情况下C3p0会在类加载路径下搜索名称为c3p0-config.xml的配置文件,因此该配置文件应该方式在类加载目录、或者jar加载目录、或者WEB-INF/classes、或类似目录下。

c3p0-config.xml文件配置如下:

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///c3p0test</property>
    <property name="user">root</property>
    <property name="password">root</property>
  </default-config>
  <named-config name="mysql2">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///c3p0test1</property>
    <property name="user">root</property>
    <property name="password">root</property>
  </named-config>
</c3p0-config>
    

当然在配置文件中可以配置数据库连接池的其他相关信息,官方建议的基本配置参数有:

acquireIncrement:声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个

initialPoolSize:当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3

minPoolSize:任何时间连接池中保存的最小连接数,默认3

maxPoolSize:在任何时间连接池中所能拥有的最大连接数,默认15

maxIdleTime:超过多长时间连接自动销毁,默认为0,即永远不会自动销毁

代码如下:

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils {

    private static DataSource dataSource = null;

    static{
        dataSource = new ComboPooledDataSource("javawebapp");
    }

    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DBException("");
        }
    }

    public static void release(Connection connection) {
        try {
            if(connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DBException("");
        }
    }

}

C03p0的官方参考模板如下:

<c3p0-config>
  <default-config>
    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
超过多长时间连接自动销毁,默认为0,即永远不会自动销毁
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>

    <user-overrides user="test-user">
      <property name="maxPoolSize">10</property>
      <property name="minPoolSize">1</property>
      <property name="maxStatements">0</property>
    </user-overrides>

  </default-config>

  <!-- This app is massive! -->
  <named-config name="intergalactoApp">
声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个
<property name="acquireIncrement">50</property>
当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3
<property name="initialPoolSize">100</property>
任何时间连接池中保存的最小连接数,默认3
<property name="minPoolSize">50</property>
在任何时间连接池中所能拥有的最大连接数,默认15
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property>
    <property name="maxStatementsPerConnection">5</property>

    <!-- he‘s important, but there‘s only one of him -->
    <user-overrides user="master-of-the-universe">
      <property name="acquireIncrement">1</property>
      <property name="initialPoolSize">1</property>
      <property name="minPoolSize">1</property>
      <property name="maxPoolSize">5</property>
      <property name="maxStatementsPerConnection">50</property>
    </user-overrides>
  </named-config>
</c3p0-config>

Tomcat内置数据源(DBCP)

Tomcat中内置有数据源,而DBCP与tomcat同属于Apache的项目,因此不难知道tomcat中内置的数据源其实就是DBCP数据源。使用Tomcat的内置数据源可分为两步:

一:为tomcat配置数据源

通常情况下,在使用eclipse或Myeclipse开发时,自己习惯于使用如下方式为tomcat配置数据源:

在web应用的META-INF文件夹下创建一个context.xml配置文件,并在其中添加<Context>标签进行配置,但,这种方式生成的数据源只能用于当前web应用.

详细context.xml文件的参考代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<Context>
<Resource name="jdbc/EmployeeDB" 当前创建数据连接池的名字,自己定义,在使用jndi容器获取该数据源对象时会用到
            auth="Container" 作者
            type="javax.sql.DataSource" 对象类型这里固定为DataSource即可
            username="dbusername" 数据库连接的用户名
            password="dbpassword" 连接密码
            driverClassName="com.mysql.jdbc.Driver" 驱动
            url="jdbc:mysql:///dbcptest" 数据库的url
            maxActive="8"  DBCP的参数,DBCP的其他参数可以加入
            maxIdle="4"/>
</Context>

在tomcat启动时,会逐个加载其中的web应用,当其加载到当前应用时,会加载到META-INF文件夹下该context.xml配置文件,此时tomcat会根据其中的配置信息为当前web应用创建一个数据库连接池,注该数据库连接池只能用于当前web应用,tomcat下的其他web应用无法使用该数据库连接池。至于如何配置tomcat的数据库连接池才能使当前tomcat下的所有web应用都能使用,或者可以使当前虚拟主机下的web应用都能使用?请参考其他文章:http://blog.csdn.net/u012802702/article/details/51159547。

二、程序中获取数据源

当tomcat读取到context.xml配置文件时会为当前web应用创建数据源,但我们在当前web应用中如何获取该数据源对象?

Tomcat中有一个共有的容器:jndi,当Tomcat为web应用创建数据源之后会将数据源以键值对的形式存放到jndi容器当中,其中键名就是数据源配置时给定的名字(详见context.xml配置文件)。

而Tomcat会自动将jndi容器放到初始化容器InitalContext中。且jndi以固定的名字(Java:comp/env)存储在InitalContext容器中,因此在web应用中可以通过如下步骤首先获取到数据源实例。

第一步:首先在Servlet中获取InitalContext容器实例

Context initCtx = new InitialContext();

第二步:在InitalContext容器中根据字符串java:comp/env搜寻,以及获取jndi容器实例

Context jndi = (Context) initCtx.lookup("java:comp/env");

第三部:根据数据源的名字从jndi容器获取到数据源实例。

DataSource source = jndi.lookUp("mySource");

完整参考代码如下:

Context initCtx = new InitialContext();
Context jndi = (Context) initCtx.lookup("java:comp/env");
DataSource source = jndi.lookUp("mySource");

但到此获取到数据源对象还没有结束,因为获取jndi的代码只能在Servlet中执行,即以上代码只能在Servlet中执行,因此还应创建一个Servlet类并在其init方法中加入以上代码,之后便可以将数据源对象传给其他程序使用(可以将数据源对象设为类变量、或将其放入到ServletContext作用域中等等)。同时将该Servlet配置成为tomcat启动时执行(即在web.xml配置文件中对应的该Servlet标签下添加:<load-on-startup>1</load-on-startup>)。

参考代码如下:

@Override
    public void init() throws ServletException {
        try{
            Context initCtx = new InitialContext();
            Context jndi = (Context) initCtx.lookup("java:comp/env");
            DataSource source = (DataSource) jndi.lookup("mySource");
            this.getServletContext().setAttribute(“dataSource”,source);
        }catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
时间: 2024-10-25 05:18:24

三种数据库连接池的配置及使用(For JDBC)的相关文章

Spring整合HIbernate时,三种数据库连接池的配置和比较

现在常用的开源数据库连接池主要有c3p0.dbcp.proxool三种,其中: Spring                         推荐使用dbcp: Hibernate                  推荐使用c3p0和proxool: 1.  DBCP:Apache DBCP(DataBase connection pool)数据库连接池.是Apache上的一个 java连接池项目,也是 tomcat使用的连接池组件.单独使用dbcp需要3个包:common-dbcp.jar,c

21Spring_JdbcTemplatem模板工具类的使用——配置文件(连接三种数据库连接池)

上一篇文章提到过DriverManagerDataSource只是Spring内置的数据库连接池,我们可选的方案还有c3p0数据库连接池以及DBCP数据库连接池. 所以这篇文章讲一下上面三种数据库连接池的配置文件的形式. 第一种:DriverManagerDataSource:Spring内置的数据库连接池. 第一步:编写配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="

数据库连接池简单介绍和 C3P0的JDBC配置

前面一节我们介绍了怎样利用jdbc连接数据库,已经实现了数据库的连接,可是在实际的项目开发中,能够发现基本上都使用了数据库连接池技术.为什么要使用数据库连接池呢?根源在于对数据库连接的低效管理 答: 普通的JDBC数据库连接,用户请求一次查询的时候就会向数据库发起一次连接.运行完后就断开连接,这种方式会消耗大量的资源和时间.数据库的连接资源并没有得到非常好的重复利用. 若是同一时候有几百人甚至几千人在线.频繁地进行数据库连接操作,这将会占用非常多的系统资源,严重的甚至会造成server的奔溃.这

数据库连接池的配置

一.什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放.个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患.所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠. 二.为何要使用数据库连接池? 假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极

Lvs之NAT、DR、TUN三种模式的应用配置案例

LVS 一.LVS简介     LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件之一. 二.LVS的分类 LVS-NAT:地址转换 LVS-DR: 直接路由 LVS-TUN:隧道 三.ipvsadm用法 其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分,第一部分是工作在内

LVS 三种工作模式基本配置(不含HA)

类别:原创 服务器 本文参考 LVS三种工作模式简介及案例参考http://www.sxt.cn/u/324/blog/3188 LVS DR模式基本配置参考http://www.21ops.com/ops/26717.html LVS TUN模式配置参考(其它的文档全都少了内容) http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.jizhuomi.com%2Fsoftware%2F365.html ipvsadm 命令详细参数参考 http://blog

[转]阿里巴巴数据库连接池 druid配置详解

一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐映入了大家的眼帘.接下来本教程就说一下druid的简单使用. 二.jar包下载.配置详解及配置示例 1.jar获取 可以从 http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的jar包.如果想使用最新的源码编译,也可以从 http

PDO的三种数据库连接方式

在使用PDO连接数据库之前,先要对PDO安装和配置 base.PHP如下: [php] view plain copy <strong><span style="font-size:18px;"><?php header('Content-Type:text/html;charset=utf-8'); //数组调试函数 function show_bug($msg){ echo '<pre>'; print_r($msg); echo '<

MySQL binlog日志三种模式选择及配置

在讲解binlog日志三种模式前,先了解一下解析binlog日志的命令工mysqlbinlog.mysqlbinlog工具的作用是解析mysql的二进制binlog日志内容,把二进制日志解析成可以在MySQL数据库里执行的SQL语句.binlog日志原始数据是以二进制形式存在的,需要使用mysqlbinlog工具转换成SQL语句形式.mysql的binlog日志作用是用来记录mysql内部增删改等对mysql数据库有更新内容的记录(对数据库进行改动的操作),对数据库查询的语句如show,sele