C3P0连接池
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也可以单独使用。
dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能。
使用c3p0需要导入c3p0.jar、mchange-commons-.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-pre1.jar。
步骤1:
在类目录下加入C3P0的配置文件:c3p0-config.xml
[html] view plaincopyprint?
-
<c3p0-config>
-
-
<!-- C3P0的缺省(默认)配置,-->
-
<!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->
-
-
<default-config>
-
<property name="driverClass">com.mysql.jdbc.Driver</property>
-
<property name="jdbcUrl">jdbc:mysql://localhost:3306/anysearch</property>
-
<property name="user">root</property>
-
<property name="password">123456</property>
-
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 -->
-
<property name="acquireIncrement">5</property>
-
<!--初始化的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3-->
-
<property name="initialPoolSize">10</property>
-
<!--连接池中保留的最小连接数-->
-
<property name="minPoolSize">5</property>
-
<!--连接池中保留的最大连接数。Default:15 -->
-
<property name="maxPoolSize">20</property>
-
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
-
<property name="acquireRetryAttempts">30</property>
-
<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
-
<property name="acquireRetryDelay">1000</property>
-
<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
-
<property name="autoCommitOnClose">false</property>
-
</default-config>
-
-
<!-- C3P0的命名配置,-->
-
<!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源 -->
-
-
<named-config name="MySQL">
-
<property name="driverClass">com.mysql.jdbc.Driver</property>
-
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test2</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>
还有更多可设置的参数,具体可查阅相关资料。
步骤2:
在获取数据库连接的工具类(如jdbcUtils)的静态代码块中创建池
[java] view plaincopyprint?
-
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{
-
-
-
-
-
-
-
-
-
-
-
-
-
ds = newComboPooledDataSource("MySQL");
-
-
}catch (Exception e) {
-
throw newExceptionInInitializerError(e);
-
}
-
}
-
-
-
public static Connection getConnection()throws SQLException{
-
-
return ds.getConnection();
-
}
-
-
-
public static void release(Connection conn){
-
-
if(conn!=null){
-
try{
-
-
conn.close();
-
}catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
步骤3:
在应用中获取连接
[java] view plaincopyprint?
-
Connection conn = null;
-
PreparedStatement st = null;
-
ResultSet rs = null;
-
try{
-
-
conn = JdbcUtils_C3P0.getConnection();
-
……
-
}catch (Exception e) {
-
e.printStackTrace();
-
}finally{
-
-
JdbcUtils_C3P0release(conn);
-
}
其他连接池
此外,还有其他的连接池可供选择,比如使用比较广泛的Proxool。Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
proxool和 c3p0能够更好的支持高并发,但是在稳定性方面略逊于dpcp。
可根据项目的实际需要来选择连接池。