package com.demo.datasource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Properties;
/**
* 数据库连接池:管理连接
* Sun 公司规定,如果是连接池技术,必须实现接口 java.sql.DataSource;
*
* 常用的开源连接池技术:
* DBCP 连接池;
* C3P0 连接池;
*
* DBCP 连接池:
* DBCP 是 Apache 软件基金组织下的开源连接池实现,使用 DBCP 连接池,要导入下面两个包:
* commons-dbcp-1.4.jar 连接池的实现
* commons-pool-1.5.6.jar 连接池实现的依赖库
* Tomcat 的连接池正是采用该连接池实现的。该连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
* 核心类:BasicDataSource
*
* C3P0 连接池:
* 最常用的连接池技术;Spring 框架,默认支持 C3P0 连接池技术;
* 引入 jar 包:c3p0-0.9.1.2.jar
* 核心类:ComboPooledDataSource
*/
public class Demo1 {
/**
* 编码方式实现 DBCP 连接池
*/
@Test
public void test1() throws Exception{
// DBCP 连接池核心类
BasicDataSource dataSource = new BasicDataSource();
// 连接池参数配置:初始化连接数、最大连接数、连接字符串、驱动类、用户名、密码
dataSource.setInitialSize(3); // 初始化连接数
dataSource.setMaxActive(10); // 最大连接数
dataSource.setMaxIdle(3000); // 最大空闲时间,单位:秒(当一个连接池 3 秒没被使用,就会自动关闭)
dataSource.setUrl("jdbc:mysql://localhost:3306/day17"); // 数据库连接字符串
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); // 数据库驱动类
dataSource.setUsername("root"); // 连接用户名
dataSource.setPassword("root"); // 连接密码
// 获取数据库连接
Connection connection = dataSource.getConnection();
// 执行 sql 语句
connection.prepareStatement("delete from users where id=4").executeUpdate();
// 关闭连接
connection.close();
}
/**
* 配置文件方式实现 DBCP 连接池(推荐使用)
*/
@Test
public void test2() throws Exception{
// 加载 properties 配置文件
Properties prop = new Properties();
prop.load(Demo1.class.getResourceAsStream("/dbcp.properties"));
// 使用 配置文件实例化 DataSource 对象
DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
// 获取数据库连接
Connection connection = dataSource.getConnection();
// 执行 sql 语句
connection.prepareStatement("delete from users where id=3").executeUpdate();
// 关闭
connection.close();
}
/**
* 编码方式实现 C3P0 连接池
*/
@Test
public void test3() throws Exception{
// 创建连接池核心工具类
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 设置连接参数:url、驱动、用户名、密码、初始连接数、最大连接数、最大空闲时间
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day17");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setInitialPoolSize(3);
dataSource.setMaxPoolSize(10);
dataSource.setMaxIdleTime(3000);
// 获取数据库连接
Connection connection = dataSource.getConnection();
// 执行 sql
connection.prepareStatement("delete from users where id=2").executeUpdate();
// 关闭连接
connection.close();
}
/**
* 配置文件 方式实现 C3P0 连接池
*/
@Test
public void test4() throws Exception{
// 创建 C3P0 连接池核心工具类
// 自动加载 src 目录下 C3P0 的配置文件(默认名为 c3p0-config.xml,不需要修改)
// 默认调用的是 <default-config> 配置的连接池
// ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 如果配置文件中配置了多个连接池,可以通过 configName 调用指定的连接池
// ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql_config");
// 如果 configName 写错了,找不到指定的连接池,那么就会自动去调用默认配置的连接池(<default-config>)
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql_configsss");
// 获取数据库连接
Connection connection = dataSource.getConnection();
// 执行 sql
connection.prepareStatement("delete from users where id=1").executeUpdate();
// 关闭连接
connection.close();
}
}
其中 dbcp.properties:
url = jdbc:mysql://localhost:3306/day17
username = root
password = root
driverClassName = com.mysql.jdbc.Driver
initialSize = 3
maxActive = 10
maxIdle = 3000
其中 c3p0-config.xml:
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day17</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">10</property>
<property name="maxIdleTime">3000</property>
</default-config>
<!-- 可以配置多个数据库连接池,通过 name 属性调用 -->
<named-config name="mysql_config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day17</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">10</property>
<property name="maxIdleTime">3000</property>
</named-config>
</c3p0-config>