当前位置:编程学习 > JAVA >>

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

--------------------编程问答-------------------- 是连接池wait状态,为什么你认为会有异常抛出哪?
连接池在等待你的其他占用线程释放连接,从逻辑上来说完全正确

不知道你这个测试想要达到什么目的
可以考虑一下,正常执行环境中,connection对象不应该被某个线程一直持有,用完的connection应该被close的,那连接池检测到有空闲连接,才能提供给下一个请求线程处理 --------------------编程问答-------------------- 帮楼主顶起来
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();
        }
    }

} --------------------编程问答-------------------- 在实际项目应用中可能会出现连接池不够的情况,我需要及时捕获这种异常,以便合理调整数据库连接池申请数,否则我不知道自己配置的连接池是否够用。 --------------------编程问答-------------------- 数据库连接是从连接池中取出的,每次用完了就必须要放回去,如果取出来用了就不放回去,会导致连接池的连接消耗殆尽。 打个比方, 连接池在初始化时有10个连接, 如果取出用了就不管了, 那么前10个人可以正常使用, 第十一个人之后就无法使用了, 取出的连接都是null, 后台也会抛出一大堆异常。
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,