关于C3P0超过最大连接数问题

heavenbirdliao 2012-06-11 10:42:23
这几天我在测试C3P0数据库连接池技术时,发现在超过最大连接数后再去申请数据库连接,程序会一直处于等待状态,无任何异常抛出。请问如何获取这类异常信息?
测试代码如下:

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

public class TestC3P01 {

/**
* @param args
*/
public static void main(String[] args) {
ComboPooledDataSource cpds = new ComboPooledDataSource();

try {
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
} catch (PropertyVetoException e) {
e.printStackTrace();
System.exit(1);
}
cpds.setJdbcUrl( "jdbc:mysql://127.0.0.1:3306/test" );
cpds.setUser("hb");
cpds.setPassword("123456");
cpds.setMinPoolSize(5);
cpds.setMaxPoolSize(20);
cpds.setInitialPoolSize(10);
cpds.setAcquireRetryAttempts(1);

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Connection[] c = new Connection[20];
for(int i = 0; i < 20; i++) {
try {
System.out.println(df.format(new java.util.Date()));
System.out.println("申请第" + i + "个数据库连接");
c[i] = cpds.getConnection();
System.out.println(df.format(new java.util.Date()));
} catch (SQLException e) {
System.out.println(df.format(new java.util.Date()));
e.printStackTrace();
}
}
try {
System.out.println("超过最大连接数后再次申请数据库连接");
Connection con = cpds.getConnection();
System.out.println(df.format(new java.util.Date()));
} catch (Exception e) {
System.out.println(df.format(new java.util.Date()));
e.printStackTrace();
System.exit(1);
}

try {
DataSources.destroy( cpds );
} catch (SQLException e) {
e.printStackTrace();
}
}

}
...全文
442 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
s478853630 2012-06-11
  • 打赏
  • 举报
回复
数据库连接是从连接池中取出的,每次用完了就必须要放回去,如果取出来用了就不放回去,会导致连接池的连接消耗殆尽。 打个比方, 连接池在初始化时有10个连接, 如果取出用了就不管了, 那么前10个人可以正常使用, 第十一个人之后就无法使用了, 取出的连接都是null, 后台也会抛出一大堆异常。
heavenbirdliao 2012-06-11
  • 打赏
  • 举报
回复
在实际项目应用中可能会出现连接池不够的情况,我需要及时捕获这种异常,以便合理调整数据库连接池申请数,否则我不知道自己配置的连接池是否够用。
itsinoestto 2012-06-11
  • 打赏
  • 举报
回复
帮楼主顶起来
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

public class TestC3P01 {

/**
* @param args
*/
public static void main(String[] args) {
ComboPooledDataSource cpds = new ComboPooledDataSource();

try {
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
} catch (PropertyVetoException e) {
e.printStackTrace();
System.exit(1);
}
cpds.setJdbcUrl( "jdbc:mysql:http//it.sinoest.com" );
cpds.setUser("hb");
cpds.setPassword("123456");
cpds.setMinPoolSize(5);
cpds.setMaxPoolSize(20);
cpds.setInitialPoolSize(10);
cpds.setAcquireRetryAttempts(1);

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Connection[] c = new Connection[20];
for(int i = 0; i < 20; i++) {
try {
System.out.println(df.format(new java.util.Date()));
System.out.println("申请第" + i + "个数据库连接");
c[i] = cpds.getConnection();
System.out.println(df.format(new java.util.Date()));
} catch (SQLException e) {
System.out.println(df.format(new java.util.Date()));
e.printStackTrace();
}
}
try {
System.out.println("超过最大连接数后再次申请数据库连接");
Connection con = cpds.getConnection();
System.out.println(df.format(new java.util.Date()));
} catch (Exception e) {
System.out.println(df.format(new java.util.Date()));
e.printStackTrace();
System.exit(1);
}

try {
DataSources.destroy( cpds );
} catch (SQLException e) {
e.printStackTrace();
}
}

}
beiouwolf 2012-06-11
  • 打赏
  • 举报
回复
是连接池wait状态,为什么你认为会有异常抛出哪?
连接池在等待你的其他占用线程释放连接,从逻辑上来说完全正确

不知道你这个测试想要达到什么目的
可以考虑一下,正常执行环境中,connection对象不应该被某个线程一直持有,用完的connection应该被close的,那连接池检测到有空闲连接,才能提供给下一个请求线程处理

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧