数据库连接池DBCP与C3P0详解

来源:互联网 发布:ug电极编程绘图 编辑:程序博客网 时间:2024/05/21 12:51

实际项目开发中一般都离不开数据库连接池,下面介绍两种最常用的、开源的数据库连接池组件:DBCP组件和C3P0组件。


1.为什么使用数据库连接池

已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出,拓机。

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中.


在java的web服务器上,都提供了DataSoruce的,即连接池实现的,sun公司规定,如果是自己写的连接池,要实现javax.sql.DataSource接口
目前使用最多的开源数据库连接池有:

  • DBCP 数据库连接池(tomcat)
  • C3P0 数据库连接池(hibernate)
    实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员变成时也应尽量使用这些技术,以提升程序的数据库访问性能

2.DBCP配置以及使用

①导入相关jar包

  • commons-dbcp.jar:连接池的实现
  • commons-pool.jar:连接池实现的依赖库

备注:Tomcat的连接池正是采用该连接池来实现的,该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用第二种配置方式实现,

需要注意点是:配置文件中的key与BaseDataSouce中的属性一致。(去掉set然后第一个字母小写)

使用方法有两种,一种是硬编码,由于不好维护,所以不推荐,推荐使用第二种用配置文件法。


使用方法有两种,一种是硬编码,由于不好维护,所以不推荐,推荐使用第二种用配置文件法。

第二种配置方式实现需要注意点是:配置文件中的key与BaseDataSouce中的属性一致。(去掉set然后第一个字母小写)
代码示例:

package dao;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;import org.junit.Test;import javax.sql.DataSource;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;/** * 测试DBCP数据源的使用方式 * Created by cenyu on 16-12-18. */public class testDBCP {    //1.硬编码方式实现连接池    @Test    public void test1() throws SQLException {        //DBCP连接池核心类        BasicDataSource dataSource = new BasicDataSource();        //连接池参数配置:初始化参数,最大连接数/连接字符串,驱动,用户名,密码等        dataSource.setUrl("jdbc:mysql://localhost:3306/db");        dataSource.setDriverClassName("com.mysql.jdbc.Driver");        dataSource.setUsername("root");        dataSource.setPassword("root");        dataSource.setInitialSize(3);//初始化连接数量        dataSource.setMaxActive(6);//最大连接数量        dataSource.setMaxIdle(3000);//最大空闲时间,超过这个时间就会释放        //获取连接        Connection con = dataSource.getConnection();        con.prepareStatement("DELETE FROM Admin WHERE id =2").executeUpdate();        //关闭        con.close();    }    //2.【推荐使用】配置方式实现连接池,便于维护    @Test    public void test2() throws Exception {        //加载prop配置文件        Properties prop = new Properties();        //获取文件流        InputStream inputStream=testDBCP.class.getClassLoader().getResourceAsStream("db.properties");        //加载属性配置文件        prop.load(inputStream);        //根据prop配置,直接创建数据源对象        DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);        //获取连接        Connection con = dataSource.getConnection();        con.prepareStatement("DELETE FROM Admin WHERE id =4").executeUpdate();        //关闭        con.close();    }}

DBCP配置文件
db.properties

#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/day14username=rootpassword=abc#<!-- 初始化连接 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接 -->maxIdle=20#<!-- 最小空闲连接 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 60000毫秒/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, SERIALIZABLEdefaultTransactionIsolation=REPEATABLE_READ


http://www.cnblogs.com/cenyu/p/6195467.html


3.C3P0配置及使用

C3P0连接池组件是最常用的连接池技术,Spring框架默认是支持C3P0连接池技术的。
C3P0连接池的核心类:
CombopooledDataSource ;

①引入jar文件:

c3p0-0.9.1.2.jar
②.使用连接池,创建连接

  • a.硬编码方法
  • b.配置方式(xml配置)
  • c.配置方式(properties配置)参照http://blog.csdn.net/u012050416/article/details/50738892

import com.mchange.v2.c3p0.ComboPooledDataSource;import org.junit.Test;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.SQLException;import java.util.concurrent.ConcurrentNavigableMap;/** * 使用C3P0连接池技术的两种方法 * Created by cenyu on 16-12-18. */public class testC3P0 {    //1.硬编码方式,使用c3p0连接池管理连接    @Test    public void testCode() throws Exception {        //创建连接池核心工具类        ComboPooledDataSource dataSource=new ComboPooledDataSource();        //设置连接参数:url、驱动、用户密码、初始连接数、最大连接数        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db");        dataSource.setDriverClass("com.mysql.jdbc.Driver");        dataSource.setUser("root");        dataSource.setPassword("root");        dataSource.setInitialPoolSize(3);        dataSource.setMaxPoolSize(6);        dataSource.setMaxIdleTime(1000);        //从连接池对象中,获取连接对象        Connection conn = dataSource.getConnection();        //执行跟新        conn.prepareStatement("DELETE FROM Admin WHERE id=1").executeUpdate();        //关闭        conn.close();    }    //2.xml配置方式,使用c3p0连接池管理连接    @Test    public void testXML() throws Exception{        //创建C3P0连接核心工具类        //自动加载src下c3p0的配置文件【c3p0-config.xml】        ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");//使用mysql的配置        //获取连接        Connection conn = dataSource.getConnection();        //执行连接        conn.prepareStatement("delete from Admin where id=3").executeUpdate();        //关闭        conn.close();    }}

c3p0-config.xml配置文件修改之后放在项目src的根目录下就可以了,编译之后会把这个文件编译到WEB-INF/classes下的
常用的配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>      <c3p0-config>          <!-- This is default config! -->          <default-config>              <property name="initialPoolSize">10</property>              <property name="maxIdleTime">30</property>              <property name="maxPoolSize">100</property>              <property name="minPoolSize">10</property>              <property name="maxStatements">200</property>          </default-config>                <!-- This is my config for mysql-->          <named-config name="mysql">              <property name="driverClass">com.mysql.jdbc.Driver</property>              <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>              <property name="user">root</property>              <property name="password"></property>              <property name="initialPoolSize">10</property>              <property name="maxIdleTime">30</property>              <property name="maxPoolSize">100</property>              <property name="minPoolSize">10</property>              <property name="maxStatements">200</property>          </named-config>                              <!-- This is my config for oracle -->          <named-config name="oracle">              <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>              <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>              <property name="user">scott</property>              <property name="password">liang</property>              <property name="initialPoolSize">10</property>              <property name="maxIdleTime">30</property>              <property name="maxPoolSize">100</property>              <property name="minPoolSize">10</property>              <property name="maxStatements">200</property>          </named-config>      </c3p0-config>  

参照:http://blog.csdn.net/u012050416/article/details/50738892

      http://www.cnblogs.com/cenyu/p/6195467.html

      http://www.cnblogs.com/wang-meng/p/5463020.html







0 0