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