数据库连接池C3P0
数据库连接池C3P0C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。c3p0与dbcp区别dbcp没有自动回收空闲连接的功能c3p0有自动回收空闲连接功能需要的jar包:https://download.csdn.net/download/weixin_43611145/...
数据库连接池C3P0
相关文章链接:
需要的c3p0的jar包: c3p0
观前提示:
本文使用的Eclipse版本为Photon Release (4.8.0),数据库为Mysql 5.7.24。
1.简介
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp区别:
-
dbcp没有自动回收空闲连接的功能。
-
c3p0有自动回收空闲连接功能。
c3p0-0.9.2.jar、mchange-commons-java-0.2.6.jar
2.通过set方法实现
JdbcUtils_C3P0.java
package c3p0;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtils_C3P0 {
private static ComboPooledDataSource ds = null;
//在静态代码块中创建数据库连接池
static {
try {
//通过代码创建C3P0数据库连接池
ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver"); //连接驱动
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test"); //连接数据库url
ds.setUser("root"); //数据库用户名
ds.setPassword("root"); //数据库密码
ds.setInitialPoolSize(10); //初始化连接:连接池启动时创建的初始化连接数量
ds.setMinPoolSize(5); //连接池中保留的最小连接数
ds.setMaxPoolSize(20); //连接池中保留的最大连接数
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* @Method: getConnection
* @Description: 从数据源中获取数据库连接
* @return
* @throws SQLException
* @create 2018-12-14 by jjy
*/
public static Connection getConnection() throws SQLException {
//从数据源中获取数据库连接
return ds.getConnection();
}
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();
}
}
}
}
DataSourceTest.java
package c3p0;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DataSourceTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = JdbcUtils_C3P0.getConnection();
String sql = "SELECT * FROM USER";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("ID"));
System.out.println(rs.getString("NAME"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JdbcUtils_C3P0.release(conn, ps, rs);
}
}
}
数据库表数据
运行结果
2.通过配置c3p0-config.xml文件实现
注:需要将c3p0-config.xml文件放在src路径下。
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="user">root</property>
<property name="password">root</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConectionTestPeriod">30</property>
<property name="initalPoolSize">3</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置,可以通过方法调用实现 -->
<named-config name="test">
<property name="user">root</property>
<property name="password">root</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>
JdbcUtils_C3P0.java
package c3p0Xml;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtils_C3P0 {
static ComboPooledDataSource ds = null;
static {
ds = new ComboPooledDataSource("test");
}
/**
* @Method: getConnection
* @Description: 从数据源中获取数据库连接
* @return
* @create 2018-12-14 by jjy
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
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();
}
}
}
}
DataSourceTest.java
package c3p0Xml;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DataSourceTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = JdbcUtils_C3P0.getConnection();
String sql = "SELECT * FROM USER";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("ID"));
System.out.println(rs.getString("NAME"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JdbcUtils_C3P0.release(conn, ps, rs);
}
}
}
数据库表数据
运行结果
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)