JDBC(五)_C3P0

package zr.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * c3p0的演示
 */
public class C3P0Demo1 {
    public static void main(String[] args) {
        //1.创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //2.获取连接对象
        try {
            Connection conn = ds.getConnection();

            //3.打印
            System.out.println(conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2.如下代码:(多个连接)

package zr.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * c3p0演示
 */
public class C3P0Demo2 {
    public static void main(String[] args) throws SQLException {
        //1.获取DataSource
        DataSource ds=new ComboPooledDataSource();
        //2.获取连接
        for (int i = 1;i<=10;i++){
            Connection conn=ds.getConnection();
            System.out.println(i+":"+conn);
        }
    }
}

注意这里面大的for循环是获取了十个,再看看配置文件

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1?serverTimezone=UTC</property>
    <property name="user">root</property>
    <property name="password">root</property>

    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0">
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1?serverTimezone=UTC</property>
    <property name="user">root</property>
    <property name="password">root</property>

    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">8</property>
    <!--超时时间-->
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>

 

这里面maxPoolSize设置为10,没有超过,但是如果把for循环给改成11的话会是以下的情况,这里面由于checkoutTimeout设置的为3000ms,所以在发生异常时,服务器会等待三秒,出现以下的情况

"C:\Program Files\Java\jdk-12.0.2\bin\java.exe" "-javaagent:D:\电脑软件安装位置\ij idea\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=51240:D:\电脑软件安装位置\ij idea\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\out\production\jdbcDataSource_jdbcTemplate;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\c3p0-0.9.5.2.jar;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\mchange-commons-java-0.2.12.jar;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\mysql-connector-java-8.0.17.jar zr.c3p0.C3P0Demo2
7月 30, 2019 11:58:45 上午 com.mchange.v2.log.MLog 
信息: MLog clients using java 1.4+ standard logging.
7月 30, 2019 11:58:46 上午 com.mchange.v2.c3p0.C3P0Registry 
信息: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
7月 30, 2019 11:58:46 上午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 3000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge0yta4i1kjt216cn56b|548a9f61, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0yta4i1kjt216cn56b|548a9f61, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/db1?serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
1:com.mchange.v2.c3p0.impl.NewProxyConnection@65466a6a [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4ddced80]
2:com.mchange.v2.c3p0.impl.NewProxyConnection@78e117e3 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@2ea227af]
3:com.mchange.v2.c3p0.impl.NewProxyConnection@363ee3a2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4690b489]
4:com.mchange.v2.c3p0.impl.NewProxyConnection@3eb7fc54 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7f552bd3]
5:com.mchange.v2.c3p0.impl.NewProxyConnection@460d0a57 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@47d90b9e]
6:com.mchange.v2.c3p0.impl.NewProxyConnection@3aefe5e5 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@149e0f5d]
7:com.mchange.v2.c3p0.impl.NewProxyConnection@2f7c2f4f [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6af93788]
8:com.mchange.v2.c3p0.impl.NewProxyConnection@36c88a32 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7880cdf3]
9:com.mchange.v2.c3p0.impl.NewProxyConnection@1c93084c [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6ef888f6]
10:com.mchange.v2.c3p0.impl.NewProxyConnection@7ce3cb8e [wrapping: com.mysql.cj.jdbc.ConnectionImpl@78b66d36]
Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
	at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
	at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
	at zr.c3p0.C3P0Demo2.main(C3P0Demo2.java:18)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@4b5a5ed1 -- timeout at awaitAvailable()
	at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467)
	at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
	at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
	... 2 more

Process finished with exit code 1

 

 

前十个都正常,最后,第十一个不正常,会报出一个时间out,这里面的解决办法有两种,第一种就是把xml配置文件给改一下,当然这个要看你装的服务器的版本来改,还有你的服务器的硬件配置是否支持;还有一个就是可以在第i次连接完毕后,比如第五次连接后,调用conn.close();来归还连接资源,这样就可以多用一个,其结果如下:

package zr.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * c3p0演示
 */
public class C3P0Demo2 {
    public static void main(String[] args) throws SQLException {
        //1.获取DataSource
        DataSource ds=new ComboPooledDataSource();
        //2.获取连接
        for (int i = 1;i<=11;i++){
            Connection conn=ds.getConnection();
            System.out.println(i+":"+conn);
            if (i == 5){
                conn.close();//归还连接到连接池中
            }
        }
    }
}

 

 

"C:\Program Files\Java\jdk-12.0.2\bin\java.exe" "-javaagent:D:\电脑软件安装位置\ij idea\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=51303:D:\电脑软件安装位置\ij idea\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\out\production\jdbcDataSource_jdbcTemplate;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\c3p0-0.9.5.2.jar;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\mchange-commons-java-0.2.12.jar;D:\编程存储空间\intellij_workspace\jdbcDataSource_jdbcTemplate\libs\mysql-connector-java-8.0.17.jar zr.c3p0.C3P0Demo2
7月 30, 2019 12:02:32 下午 com.mchange.v2.log.MLog 
信息: MLog clients using java 1.4+ standard logging.
7月 30, 2019 12:02:32 下午 com.mchange.v2.c3p0.C3P0Registry 
信息: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
7月 30, 2019 12:02:32 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 3000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge0yta4i1pf0tv2fn8g|548a9f61, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0yta4i1pf0tv2fn8g|548a9f61, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/db1?serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
1:com.mchange.v2.c3p0.impl.NewProxyConnection@4ddced80 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1534f01b]
2:com.mchange.v2.c3p0.impl.NewProxyConnection@2ea227af [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4386f16]
3:com.mchange.v2.c3p0.impl.NewProxyConnection@4690b489 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@79b06cab]
4:com.mchange.v2.c3p0.impl.NewProxyConnection@7f552bd3 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@3c22fc4c]
5:com.mchange.v2.c3p0.impl.NewProxyConnection@47d90b9e [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1184ab05]
6:com.mchange.v2.c3p0.impl.NewProxyConnection@6af93788 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1184ab05]
7:com.mchange.v2.c3p0.impl.NewProxyConnection@36c88a32 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7880cdf3]
8:com.mchange.v2.c3p0.impl.NewProxyConnection@1c93084c [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6ef888f6]
9:com.mchange.v2.c3p0.impl.NewProxyConnection@7ce3cb8e [wrapping: com.mysql.cj.jdbc.ConnectionImpl@78b66d36]
10:com.mchange.v2.c3p0.impl.NewProxyConnection@bef2d72 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@69b2283a]
11:com.mchange.v2.c3p0.impl.NewProxyConnection@6fe7aac8 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1d119efb]

Process finished with exit code 0

注意第五个和第六个连接的hashcode都一样

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值