c3p0连接池
0.9.jar
ComboPooledDataSource 它是DataSource子类。
Classpath:c3p0-config.xml(必须位于classpath根目录下)
ComboPooledDataSource 它是DataSource子类。
Classpath:c3p0-config.xml(必须位于classpath根目录下)
第一步:导入c3p0包
第二步:在classpath目录下,创建一个c3p0-config.xml
建议复制一个更改
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,只可以出现一次 -->
<default-config>
<!-- 连接超时设置30秒 -->
<property name="checkoutTimeout">30000</property>
<!-- 30秒检查一次connection的空闲 -->
<property name="idleConnectionTestPeriod">30</property>
<!--初始化的池大小 -->
<property name="initialPoolSize">2</property>
<!-- 最多的一个connection空闲时间 -->
<property name="maxIdleTime">30</property>
<!-- 最多可以有多少个连接connection -->
<property name="maxPoolSize">10</property>
<!-- 最少的池中有几个连接 -->
<property name="minPoolSize">2</property>
<!-- 批处理的语句
-->
<property name="maxStatements">50</property>
<!-- 每次增长几个连接 -->
<property name="acquireIncrement">3</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>
</property>
<property name="user">root</property>
<property name="password">1234</property>
</default-config>
</c3p0-config>
第三步:创建工厂类获取这个连接
public class DataSourceUtils {
private static DataSource ds;
static{
ds = //默认的读取c3p0-config.xml中默认配置
new ComboPooledDataSource();
}
public static DataSource getDatasSource(){
return ds;
}
public static Connection getConn(){
Connection con = null;
try{
con = ds.getConnection();//每一次从ds中获取一个新的连接
}catch(Exception e){
e.printStackTrace();
}
return con;
}
}
这里补充下另外一种包装模式在使用前才包装 生成的时候不包装(性能会提升很多)
public class MyDataSource implements DataSource {
private LinkedList<Connection> pool = new LinkedList<Connection>();
public MyDataSource() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
for (int i = 0; i < 3; i++) {
//创建原生的连接,// com.mysql.jdbc.JDBC4Connection@8888
Connection con = DriverManager.getConnection(url, "root",
"");
// ****************************
// 原来是
// MyConn conn=new MyConn(con);
// pool.add(conn);
pool.add(con);//将没有经过包装类放到池
// ****************************
}
} catch (Exception e) {
e.printStackTrace();
}
}
//此方法来自于datasource,用于返回一个连接
public Connection getConnection() throws SQLException {
synchronized (pool) {
if (pool.size() == 0) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
Connection con = pool.removeFirst();
System.err.println("siize:" + pool.size());
// ***********************************
//在返回之前包装这个类
MyConn mc = new MyConn(con);
// ****************************
return mc;
}
}
// 以下包装connection
class MyConn implements Connection {
// 声明被包装类的成员
private Connection conn;
// 通过构造接收MySql的connection的对象JDBC4Connection@8888
public MyConn(Connection con) {
this.conn = con;
}
//关闭连接
public void close() throws SQLException {
synchronized (pool) {
//有人调用了关闭方法,不能关
System.err.println("有人还连接了。。。。"+this);
//**********************************************这里不能是add(this)
pool.add(conn);
//****************************************
pool.notify();
}
}}}
ComboPooledDataSource有三个构造:
没有参数的.
接收一个boolean
默认的情况下,为true,即所有connection.autoCommit属性为true.而且为你初始化你没有设置的其他值
接收一个字符串的
在一个c3p0-config.xml文件中中,可以配置多种连接。 除了默认连接,其他都叫命名的连接。通过
<named-config name=”xxxx”/>
static{
ds = new ComboPooledDataSource("db909");
}
其中必须手动设置的配置有
<!--初始化的池大小 -->
<property name="initialPoolSize">2</property>
<!-- 最多可以有多少个连接connection -->
<property name="maxPoolSize">10</property>
<!-- 最少的池中有几个连接 -->
<property name="minPoolSize">2</property>
<!-- 批处理的语句
-->
<property name="maxStatements">50</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>
</property>
<property name="user">root</property>
<property name="password">1234</property>
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 30000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 306nod8zpo8rl21muvlc9|3813c, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 306nod8zpo8rl21muvlc9|3813c, idleConnectionTestPeriod -> 30, initialPoolSize -> 2, jdbcUrl -> jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 30, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 2, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]这些值都可以配置
总结:
C3p0连接池,只有当用户获取连接时,才会包装Connection。