C3P0
C3p0
- 是一个开源的JDBC连接池,目前使用它的开源项目是Hibernate、Spring
C3P0和dbcp区别:
- dbcp没有自动回收空闲连接的功能
- C3P0有自动回收空闲连接的功能
需要用到的jar包
c3p0-0.9.5.5、mchange-commons-java-0.2.19
1、导包
2、在类目录下加入C3P0的配置文件:c3p0-config.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--
C3P0的缺省(默认)配置,
如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写
就表示使用的是C3P0的缺省(默认)配置信息来创建数据源
-->
<default-config>
<propertyname="driverClass">com.mysql.jdbc.Driver</property>
<propertyname="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy?
useUnicode=true&characterEncoding=utf8&useSSL=true</property>
<propertyname="user">root</property>
<propertyname="password">123456</property>
<propertyname="acquireIncrement">5</property>
<propertyname="initialPoolSize">10</property>
<propertyname="minPoolSize">5</property>
<propertyname="maxPoolSize">20</property>
</default-config>
<!--
C3P0的命名配置,
如果在代码中“ComboPooledDataSource ds = new
ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据
源
-->
<named-configname="MySQL">
<propertyname="driverClass">com.mysql.jdbc.Driver</property>
<propertyname="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy?
useUnicode=true&characterEncoding=utf8&useSSL=true</property>
<propertyname="user">root</property>
<propertyname="password">123456</property>
<propertyname="acquireIncrement">5</property>
<propertyname="initialPoolSize">10</property>
<propertyname="minPoolSize">5</property>
<propertyname="maxPoolSize">20</property>
</named-config>
</c3p0-config>
3、创建工具类
packagecom.kuang.datasource.utils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importcom.mchange.v2.c3p0.ComboPooledDataSource;
//数据库连接工具类
publicclassJdbcUtils_C3P0 {
privatestaticComboPooledDataSourceds=null;
//在静态代码块中创建数据库连接池
static{
try{
//通过代码创建C3P0数据库连接池
/*ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbcstudy");
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=newComboPooledDataSource("MySQL");//使用C3P0的命名配置来创建数据源
////////////////////////////////////////////
}catch (Exceptione) {
thrownewExceptionInInitializerError(e);
}
}
//从数据源中获取数据库连接
publicstaticConnectiongetConnection() throwsSQLException{
//从数据源中获取数据库连接
returnds.getConnection();
/////////////////////////////////
}
//释放资源
publicstaticvoidrelease(Connectionconn,Statementst,ResultSetrs){
if(rs!=null){
try{
//关闭存储查询结果的ResultSet对象
rs.close();
}catch (Exceptione) {
e.printStackTrace();
}
rs=null;
}
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch (Exceptione) {
e.printStackTrace();
}
}
if(conn!=null){
try{
//将Connection连接对象还给数据库连接池
conn.close();
}catch (Exceptione) {
e.printStackTrace();
}
}
}
}
测试
packagecom.kuang.datasource;
importcom.kuang.datasource.utils.JdbcUtils_C3P0;
importcom.kuang.datasource.utils.JdbcUtils_DBCP;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.util.Date;
publicclassC3P0Test {
publicstaticvoidmain(String[] args) {
Connectionconn=null;
PreparedStatementst=null;
ResultSetrs=null;
try{
//获取数据库连接
conn=JdbcUtils_C3P0.getConnection();
///////////////////////////////
Stringsql="insert into users(id,name,password,email,birthday)
values(?,?,?,?,?)";
st=conn.prepareStatement(sql);
st.setInt(1, 6);//id是int类型的
st.setString(2, "kuangshen");//name是varchar(字符串类型)
st.setString(3, "123");//password是varchar(字符串类型)
st.setString(4, "24736743@qq.com");//email是varchar(字符串类型)
st.setDate(5, newjava.sql.Date(new
Date().getTime()));//birthday是date类型
inti=st.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
}catch (Exceptione) {
e.printStackTrace();
}finally{
//释放资源
JdbcUtils_C3P0.release(conn, st, rs);
////////////////////////
}
}
}