(18)JDBC连接池技术(二部分:C3P0,DBCP)

本文介绍了数据库连接池的概念及其重要性,对比分析了两种常见的连接池实现:C3P0和DBCP。通过示例展示了如何配置和使用这两种连接池,并提供了完整的测试代码。

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

1 何为连接池

连接池是用来管理Conection的,前面的博客中使用JDBC时每次都需要获取连接,这其实对数据库的资源消耗较大。有了连接池,我们就不需要自己来创建Connecton,而是通过池来获取Connection对象,用完了再还回去。目前两种连接池较为常见:C3P0 和 DBCP。

2 C3P0连接池

2.1 导入jar包

c3p0-0.9.1.2.jar

2.2 配置文件

名称:c3p0-config.xml

位置:src下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///web09</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">20</property>
	</default-config>

	<named-config name="itheima">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///web09</property>
		<property name="user">root</property>
		<property name="password">root</property>
	</named-config>


</c3p0-config>
2.3 C3P0工具类
package cn.itheima.jdbc.utils;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	public static DataSource getDataSource(){
		return dataSource;
	}
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
2.4 测试
package cn.itheima.jdbc.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;

import cn.itheima.jdbc.utils.C3P0Utils;
import cn.itheima.jdbc.utils.JDBCUtils_v3;

public class TestC3P0 {
	@Test
	public void testAddUser1(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			//2.从池子中获取连接
			conn = C3P0Utils.getConnection();
			
			String sql = "INSERT INTO USER VALUES(?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, 7);
			pstmt.setString(2, "韩某某");
			int rows = pstmt.executeUpdate();
			if(rows > 0){
				System.out.println("添加成功");
			}else{
				System.out.println("添加失败");
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally{
			JDBCUtils_v3.release(conn, pstmt, null);
	}
	}
	
	
	
	
	/**
	 * 添加用户
	 * 使用未改造的connection
	 */
	@Test
	public void testAddUser(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		//1.创建c3p0连接池对象
		ComboPooledDataSource dataSource = new ComboPooledDataSource();//加载默认配置
		//ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");//加载named-config配置
		
		try {
			//2.从池子中获取连接
			conn = dataSource.getConnection();
			
			String sql = "INSERT INTO USER VALUES(?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, 7);
			pstmt.setString(2, "韩某某");
			int rows = pstmt.executeUpdate();
			if(rows > 0){
				System.out.println("添加成功");
			}else{
				System.out.println("添加失败");
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally{
			JDBCUtils_v3.release(conn, pstmt, null);
	}
	}
}

3 DBCP连接池

3.1 导入jar包

commons-dbcp-1.4.jar

3.2 书写配置文件

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web09?useUnicode=true&characterEncoding=utf8
username=root
password=root
3.3 DBCP工具类
package cn.itheima.jdbc.utils;


import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtils {
	private static DataSource dataSource;
	static{
		try {
			//1.加载找properties文件输入流
			InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
			//2.加载输入流
			Properties props = new Properties();
			props.load(is);
			//3.创建数据源
			dataSource = BasicDataSourceFactory.createDataSource(props);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

3.4 测试
package cn.itheima.jdbc.test;

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

import cn.itheima.jdbc.utils.DBCPUtils;

public class TestDBCP {

	@Test
	public void testUpdateUserById(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DBCPUtils.getConnection();
			String sql ="UPDATE USER SET NAME=? WHERE id=?;";
			pstmt= conn.prepareStatement(sql);
			pstmt.setString(1, "刘某某");
			pstmt.setInt(2, 2);
			int rows = pstmt.executeUpdate();
			if(rows>0){
				System.out.println("更新成功!");
			}else{
				System.out.println("更新失败!");
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值