DBCP与C3P0连接池组件

本文介绍DBCP和C3P0两种数据库连接池技术的使用方法,包括硬编码方式和配置文件方式,并对比它们的核心类及配置参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,概述

平常操作数据库时,都是用户想数据库请求获得连接,而数据库创建连接通常需要消耗相对比较大的资源,创建时间也比较长.如果一个网站每天有上百万的访问量,那么数据库服务器就需要创建上百万次的连接.这对数据库资源是极大的浪费,容易造成服务器内存溢出 宕机等.所以呢,就有了连接池技术.连接池技术的核心思想(这段话来自百度):连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。开源的DBCP和C3P0两种连接池组件就是本文的重点了.

二,DBCP连接池组件

1)SUN公司约定,如果是连接池技术,那么必须实现javax.sql.DataSource接口!

2)DBCP是Apache组织的开源连接池技术实现.使用DBCP数据源,应用程序需要引入两个jar文件,一是commons-dbcp-1.4.jar,另一个就是commons-pool-1.5.6.jar,后面的数字是版本号.可去官网下载相应的组件.

3)Tomcat的连接池就是通过DBCP连接池来实现的.该数据库连接池既可以与应用服务器整合使用,也可以与应用程序独立使用.

4)DBCP核心类:BasicDataSource.

5)代码实现

a,硬编码方式

// 1,硬编码方式实现连接池
	@Test
	public void testDbcp() throws Exception {
		private Connection conn = null;
		// DBCP连接池核心类
		BasicDataSource dataSource = new BasicDataSource();
		// 连接池参数配置:连接字符串 驱动 用户名 密码 初始化连接数 最大连接数
		dataSource.setUrl("jdbc:mysql://localhost:3306/day15");
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUsername("root");
		dataSource.setPassword("abc");
		dataSource.setInitialSize(3);//初始化连接池大小,有三个连接
		dataSource.setMaxActive(6);  //最大连接池大小
		dataSource.setMaxIdle(3000);// 最大空闲时间3秒

		// 获得连接
		conn = dataSource.getConnection();

		//conn.prepareStatement("delete from dept where id=15").executeUpdate();
		
		for(int i=0;i<23;i++){
			String value ="Lucy"+i;
			String sql="insert into dept(deptName) values(?)";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setObject(1, value);
			pstmt.executeUpdate();
		}
		// 关闭资源
		conn.close();
	}
通过DBCP核心类设置配置参数从而获得数据库连接.

b,通过配置文件方式实现连接池,可扩展性强,易于维护

/**
	 * 2,配置方式实现连接池
	 * 推荐使用,便于维护
	 * 配置文件中的key要与BasicDataSource中的属性一样
	 * @throws Exception
	 */
	@Test
	public void testProp() throws Exception {

                 private Connection conn = null;

  // 加载Properties配置文件Properties prop = new Properties();// 获取输入流InputStream in = App_DBCP.class.getResourceAsStream("db.properties");// 加载属性配置文件prop.load(in);// 通过配置参数,直接创建数据源DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);// 获得连接conn = dataSource.getConnection();conn.prepareStatement("delete from dept where id=14").executeUpdate();// 关闭资源conn.close();}

db.properites文件内容如下(该文件与上面的代码所在的Java文件在同一个包下):

url=jdbc:mysql://localhost:3306/day15
driverClassName=com.mysql.jdbc.Driver
username=root
password=abc
initialSize=3
maxActive=6
maxIdle=3000

三,C3P0连接池组件

1)C3P0连接池是最常用的连接池技术!Spring框架默认支持C3P0连接池技术.

2)C3P0核心类:CombopooledDataSource

3)引入相应的jar包:c3p0-0.9.1.2.jar,下载相应的组件,导入jar包.

4)代码实现

a,硬编码方式

/**
	 * 1,硬编码方式:使用c3p0连接池管理连接
	 * 
	 * @throws Exception
	 */
	@Test
	public void testC3p0() throws Exception {
		// 创建连接池核心工具类
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		// 设置参数:url 驱动 用户名 密码 初始连接数 最大连接数 空闲时间
		dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day15");
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		dataSource.setUser("root");
		dataSource.setPassword("abc");
		dataSource.setInitialPoolSize(3);
		dataSource.setMaxPoolSize(6);
		dataSource.setMaxIdleTime(2000);// 两秒

		// 获得连接
		Connection conn = dataSource.getConnection();
                //执行sql语句
		conn.prepareStatement("delete from dept where id=13").executeUpdate();

		// 关闭资源
		conn.close();
	}
和DBCP连接池的方式是不是很像啊?每错,就是很像...
b,配置参数方式(这就有点不一样了)

/**
	 * 2,XML配置方式方式:使用c3p0连接池管理连接
	 * 
	 * @throws Exception
	 */
	@Test
	public void testXml() throws Exception {
		// 创建连接池核心工具类
		// 自动加载src下c3p0的配置文件[c3p0-config.xml],这个文件可以去源码里拷贝模仿
		 ComboPooledDataSource dataSource = new ComboPooledDataSource();

		// 传入参数,使用命名的配置:加载c3p0-config.xml里oracle_config里面的配置文件,不传参数就是默认的<default-config>的配置信息
//		ComboPooledDataSource dataSource = new ComboPooledDataSource(
//				"oracle_config");

		// 获得连接
		Connection conn = dataSource.getConnection();

		conn.prepareStatement("delete from dept where id=12").executeUpdate();

		// 关闭资源
		conn.close();

	}
c3p0-config.xml:

<c3p0-config>
  <default-config>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day15</property> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="user">root</property>
    <property name="password">abc</property>
    <property name="initialPoolSize">3</property>
    <property name="maxPoolSize">6</property>
    <property name="maxIdleTime">2000</property> 

    <!--
    <user-overrides user="swaldman">
      <property name="debugUnreturnedConnectionStackTraces">true</property>
    </user-overrides>
    -->

  </default-config>

<!--
  <named-config name="oracle_config">
    <property name="maxStatements">200</property>
    <property name="jdbcUrl">jdbc:test</property>
    <user-overrides user="poop">
      <property name="maxStatements">300</property>
    </user-overrides>
   </named-config>
-->

</c3p0-config>
这个配置文件可参考c3p0组件的源码里面的配置文件写法.

四,总结

好了,以上就是两种连接池得用法了.下一篇实战,C3P0+DbUtils实现一个JdbcUtils工具类,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值