C3P0连接池
C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
创建项目 导入 jar包
导入配置文件 c3p0-config.xml
- 注意:c3p0-config.xml 文件名不可更改
- 直接放到src下,也可以放到到资源文件夹中
<c3p0-config>
<!--默认配置-->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- initialPoolSize:初始化时获取三个连接,
取值应在minPoolSize与maxPoolSize之间。 -->
<property name="initialPoolSize">3</property>
<!-- maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。-->
<property name="maxIdleTime">60</property>
<!-- maxPoolSize:连接池中保留的最大连接数 -->
<property name="maxPoolSize">100</property>
<!-- minPoolSize: 连接池中保留的最小连接数 -->
<property name="minPoolSize">10</property>
</default-config>
<!--配置连接池mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db5</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
<!--配置连接池2,可以配置多个-->
</c3p0-config>
常见配置项
分类 | 属性 | 描述 |
---|---|---|
必须项 | user | 用户名 |
必须项 | password | 密码 |
必须项 | driverClass | 驱动 |
必须项 | jdbcUrl | 路径 |
基本配置 | initialPoolSize | 连接池初始化时创建的连接数。 默认值:3 |
基本配置 | maxIdleTime | 连接池中拥有的最大连接数。 默认值:15. |
基本配置 | maxPoolSize | 连接池保持的最小连接数。 10. |
基本配置 | minPoolSize | 连接的最大空闲时间。 如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接, 如果为0,则永远不会断开连接。 默认值:0. |
1. 编写工具类
C3P0提供的核心工具类, ComboPooledDataSource
, 如果想使用连接池,就必须创建该类的对象
new ComboPooledDataSource(); 使用 默认配置
new ComboPooledDataSource(“mysql”); 使用命名配置
1.1 工具类实例:
package com.cyh.utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class C3P0Utils {
//1. 创建连接池对象 C3P0对DataSource接口的实现类
/**
* 使用的配置是配置文件中的群认配置
*/
/*public static ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
/**
* 使用指定的配置
*/
public static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
/**
* 获取连接的方法
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 释放资源方法
* @param con
* @param statement
*/
public static void close(Connection con, Statement statement){
if(con != null && statement != null){
try {
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放资源方法
* @param con
* @param statement
* @param resultSet
*/
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){
try {
resultSet.close();
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试:
实例:查询姓名为 李白的员工信息
package com.cyh.testpool;
import com.cyh.utils.C3P0Utils;
import java.sql.*;
public class TestC3P0 {
// 查询姓名为 李白的员工信息
public static void main(String[] args) throws SQLException {
//1. 获取连接
Connection con = C3P0Utils.getConnection();
//2. 获取预处理对象
String sql = "select * from employee where ename = ?";
PreparedStatement preparedStatement = con.prepareStatement(sql);
//3. 设置占位符的值
preparedStatement.setString(1,"李白");
ResultSet resultSet = preparedStatement.executeQuery();
//4. 处理结果集
while (resultSet.next()){
int eid = resultSet.getInt("eid");
String ename = resultSet.getString("ename");
int age = resultSet.getInt("age");
String sex = resultSet.getString("sex");
double salary = resultSet.getDouble("salary");
Date date = resultSet.getDate("empdate");
System.out.println(eid +" " + ename + " " + age +" " + sex +" " + salary +" "
+date);
}
//5.释放资源
C3P0Utils.close(con,preparedStatement,resultSet);
}
}