Code Bye

c3p0连接池满后的连接死锁问题

 

多线程编程测试条件下:如果c3p0连接池设置过小。当连接池满时。由于没有对各个线程设置优先级。导致后面的线程一直等待连接。造成死锁。
求简洁有效的解决方法。推荐可以解决上面问题的连接池也可以。

jdbc.initialPoolSize=5
jdbc.minPoolSize=3
jdbc.maxPoolSize=10
jdbc.maxIdleTime=600
jdbc.acquireIncrement=2
jdbc.idleConnectionTestPeriod=120
jdbc.maxConnectionAge=400

class T extends Thread {
private int num;
public T(int num) {
this.num = num;
}
@Override
public void run() {
System.out.println(“==in ” + num);
Map<String, Class<?>> map = getTableColumns(“sns_user_main_info”);
System.out.println(“–” + map.size());
System.out.println(“==out ” + num);
}
}

class H extends Thread {
@Override
public void run() {
while(true) {
try {
T t1 = new T(1);
T t2 = new T(2);
T t3 = new T(3);
T t4 = new T(4);
T t5 = new T(5);
T t6 = new T(6);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

有些不明白lz的测试场景,难道所有的线程都是长时间占用连接的吗?如果是那就是应该调大连接数。如果不是,那关闭连接后就会有等待线程可以访问了。怎么还能出这个情况?
没有想明白。。。

40分
连接如果用完了是正常释放的,那连接池满就是你业务确实需要这么大的连接容量,如果是你无论加多大的池容量,都还是会连接池满,那很有可能是连接池泄漏

成熟的商业J2EE应用服务器比如Weblogic是有检测连接泄漏的机制的,开启后可以看到是否有数据库连接没有关闭,在哪个类哪个方法创建的连接等

搞定了。
qingyuan18 说的很对。 这两个问题都存在:一个是这些线程中的业务处理时间过长。另外检测后发现确实有一个线程在错误情况下出现了连接泄露。

谢谢啊


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c3p0连接池满后的连接死锁问题