C3P0数据源
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0数据源在项目开发中使用得比较多。
c3p0与dbcp区别
- dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
创建c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- c3p0-config.xml必须位于类路径下面 -->
<c3p0-config>
<!-- C3P0的缺省(默认)配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<!-- C3P0的命名配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源 -->
<named-config name="MySQL">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</named-config>
</c3p0-config>
创建JdbcUtils_C3P0:
package com.xc.jdbc.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* @ClassName: JdbcUtils_C3P0
* @Description: 数据库连接工具类
* @author: 孤傲苍狼
* @date: 2014-10-4 下午6:04:36
*/
public class JdbcUtils_C3P0 {
private static ComboPooledDataSource ds = null;
// 在静态代码块中创建数据库连接池
static {
try {
// 通过代码创建C3P0数据库连接池
// ds = new ComboPooledDataSource();
// ds.setDriverClass("com.mysql.cj.jdbc.Driver");
// ds.setJdbcUrl("jdbc:mysql://localhost:3306/testsvnb?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true");
// ds.setUser("root");
// ds.setPassword("123456");
// ds.setInitialPoolSize(10);
// ds.setMinPoolSize(5);
// ds.setMaxPoolSize(20);
// 通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下
ds = new ComboPooledDataSource();// 使用C3P0的默认配置来创建数据源
// ds = new ComboPooledDataSource("MySQL");// 使用C3P0的命名配置来创建数据源
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* @Method: getConnection
* @Description: 从数据源中获取数据库连接
* @Anthor:孤傲苍狼
* @return Connection
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
// 从数据源中获取数据库连接
return ds.getConnection();
}
/**
* @Method: release
* @Description: 释放资源, 释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
* @Anthor:孤傲苍狼
*
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn, Statement st, ResultSet rs) {
if (rs != null) {
try {
// 关闭存储查询结果的ResultSet对象
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if (st != null) {
try {
// 关闭负责执行SQL命令的Statement对象
st.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
// 将Connection连接对象还给数据库连接池
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* @Method: getDataSource
* @Description: 获取数据源
* @Anthor:孤傲苍狼
* @return DataSource
*/
public static DataSource getDataSource() {
// 从数据源中获取数据库连接
return ds;
}
}
创建测试类DataSourceTest:
package com.xc.jdbc.curd;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.xc.jdbc.util.JdbcUtils_C3P0;
import com.xc.jdbc.util.JdbcUtils_DBCP;
public class DataSourceTest {
@Test
public void c3p0DataSourceTest() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 获取数据库连接
conn = JdbcUtils_C3P0.getConnection();
String sql = "insert into test1(name) values(?)";
st = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
st.setString(1, "gacl");
st.executeUpdate();
// 获取数据库自动生成的主键
rs = st.getGeneratedKeys();
if (rs.next()) {
System.out.println(rs.getInt(1));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils_C3P0.release(conn, st, rs);
}
}
}
参考文章:
https://www.cnblogs.com/xdp-gacl/p/4002804.html
来源:https://www.cnblogs.com/ooo0/p/10349883.html