采用JDBC连接池遇到的问题

当数据库连接达到最大数量时,可通过调整max_connections参数或使用连接池如c3p0进行管理。c3p0是一个JDBC3连接和语句池,提供线程安全的数据源配置,通过设置属性如`maxStatements`来定制连接池行为,简化数据库连接获取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近采用多线程使用JDBC连接数据库时,遇到如下问题,当连接次数达到一定次数后,就出现了如下错误提示
17:18:14,569 DEBUG BasicResourcePool:1831 - An exception occurred while acquiring a poolable resource. Will retry.
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException : Too many connections
    at com.mysql.jdbc.SQLError.createSQLException( SQLError.java:921 )
    at com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:2822 )
    at com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:777 )
    at com.mysql.jdbc.MysqlIO.secureAuth411( MysqlIO.java:3216 )
    at com.mysql.jdbc.MysqlIO.doHandshake( MysqlIO.java:1147 )
    at com.mysql.jdbc.Connection.createNewIO( Connection.java:2595 )
    at com.mysql.jdbc.Connection.<init>( Connection.java:1509 )
    at com.mysql.jdbc.NonRegisteringDriver.connect( NonRegisteringDriver.java:266 )
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection( DriverManagerDataSource.java:135 )
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection( WrapperConnectionPoolDataSource.java:182 )
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection( WrapperConnectionPoolDataSource.java:171 )
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource( C3P0PooledConnectionPool.java:137 )
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire( BasicResourcePool.java:1014 )
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800( BasicResourcePool.java:32 )
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run( BasicResourcePool.java:1810 )
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run( ThreadPoolAsynchronousRunner.java:547 )
17:18:14,569 DEBUG BasicResourcePool:404 - incremented pending_acquires: 3
17:18:14,584 DEBUG BasicResourcePool:1831 - An exception occurred while acquiring a poolable resource. Will retry.
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException : Data source rejected establishment of connection,  message from server: "Too many connections"
    at com.mysql.jdbc.SQLError.createSQLException( SQLError.java:921 )
    at com.mysql.jdbc.MysqlIO.doHandshake( MysqlIO.java:962 )
    at com.mysql.jdbc.Connection.createNewIO( Connection.java:2595 )
    at com.mysql.jdbc.Connection.<init>( Connection.java:1509 )
    at com.mysql.jdbc.NonRegisteringDriver.connect( NonRegisteringDriver.java:266 )
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection( DriverManagerDataSource.java:135 )
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection( WrapperConnectionPoolDataSource.java:182 )
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection( WrapperConnectionPoolDataSource.java:171 )
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource( C3P0PooledConnectionPool.java:137 )
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire( BasicResourcePool.java:1014 )
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800( BasicResourcePool.java:32 )
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run( BasicResourcePool.java:1810 )
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run( ThreadPoolAsynchronousRunner.java:547 )

这个是已经达到了数据库得最大连接个数,解决的方法可以设置数据库得max_connections的个数。另外一种就是可以采取连接池得方式,从连接池中获取Connection对象,由连接池来管理和数据库得连接。

c3p0-0.9.1.1就是提供了一个连接池得管理,c3p0 - JDBC3 Connection and Statement Pooling。

下栽网址   http://sourceforge.net/projects/c3p0/

使用得时候,把解压后lib/c3p0-0.9.1.1.jar 加入到ClASSPATH中中就行了。在里面提供了几个Example

线程和非线程的

DataSource ds_unpooled = DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb", "swaldman", "test-password");

DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled ); 你还可以自己设置数据源的一些属性

Map overrides = new HashMap();

overrides.put("maxStatements", "200");

DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled, overrides );

获取Connection对象

Connection conn = ds_pooled.getConnection();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值