关于C3P0超过最大连接数有关问题
阅读
这几天我在测试C3P0数据库连接池技术时,发现在超过最大连接数后再去申请数据库连接,程序会一直处于等待状态,无任何异常抛出。请问如何获取这类异常信息?
测试代码如下:
- Java code
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(); } } }
------解决方案--------------------
当超过最大数以后,连接池就会等待之前申请的连接被释放,如果超过指定时间就会报获取连接超时异常。
这个超时时间,可以用 setCheckoutTimeout() 来进行设置。
最大连接数本来就是控制整个连接池跟数据库之间建立连接的上限,一直持续获取而不close是不对滴。
阅读
上一篇:关于list内部排序有关问题?就是那么奇怪呀! 下一篇:返回列表