这几天我在测试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是不对滴。