粗略的看了下源码,发现数据库池pool对象在应用中没有使用static关键字,我的理解是一般情况下pool对象应该只有一个(除非使用多种数据库,就创建多个pool),如果一个类属性中有pool对象,不使用static,那new一个对象不是就多了一个pool对象吗?还有在多用户访问数据库的时候,是多个Connection对象还是只有一个Connection对应多个用户,我听人说只有一个Connection对象,那pool里面 new 那么多Connection是怎么回事。
头痛啊!源码太多,手按鼠标都按疼了,哪位大牛能解答我的疑惑,跪谢了!

解决方案 »

  1.   

    这个应该是单例模式,不是用new的,有个参数可以控制最大的实体个数,然后是用getInsatance()之类的方法来得到实体,而不是用new
      

  2.   


        public GenericObjectPoolFactory(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) {
            this(factory,maxActive,whenExhaustedAction,maxWait,maxIdle,minIdle,testOnBorrow,testOnReturn,timeBetweenEvictionRunsMillis,numTestsPerEvictionRun,minEvictableIdleTimeMillis,testWhileIdle, GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
        }   
        public GenericObjectPoolFactory(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle, long softMinEvictableIdleTimeMillis) {
            this(factory,maxActive,whenExhaustedAction,maxWait,maxIdle,minIdle,testOnBorrow,testOnReturn,timeBetweenEvictionRunsMillis,numTestsPerEvictionRun,minEvictableIdleTimeMillis,testWhileIdle,softMinEvictableIdleTimeMillis, GenericObjectPool.DEFAULT_LIFO);
        }
    returnObject.    public GenericObjectPoolFactory(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle, long softMinEvictableIdleTimeMillis, boolean lifo) {
            _maxIdle = maxIdle;
            _minIdle = minIdle;
            _maxActive = maxActive;
            _maxWait = maxWait;
            _whenExhaustedAction = whenExhaustedAction;
            _testOnBorrow = testOnBorrow;
            _testOnReturn = testOnReturn;
            _testWhileIdle = testWhileIdle;
            _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
            _numTestsPerEvictionRun = numTestsPerEvictionRun;
            _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
            _softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
            _lifo = lifo;
            _factory = factory;
        }    public ObjectPool createPool() {
            return new GenericObjectPool(_factory,_maxActive,_whenExhaustedAction,_maxWait,_maxIdle,_minIdle,_testOnBorrow,_testOnReturn,_timeBetweenEvictionRunsMillis,_numTestsPerEvictionRun,_minEvictableIdleTimeMillis,_testWhileIdle,_softMinEvictableIdleTimeMillis,_lifo);
        }    protected int _maxIdle = GenericObjectPool.DEFAULT_MAX_IDLE;
        protected int _minIdle = GenericObjectPool.DEFAULT_MIN_IDLE;
        protected int _maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE;
        protected long _maxWait = GenericObjectPool.DEFAULT_MAX_WAIT;
        protected byte _whenExhaustedAction = GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION;
        protected boolean _testOnBorrow = GenericObjectPool.DEFAULT_TEST_ON_BORROW;
        protected boolean _testOnReturn = GenericObjectPool.DEFAULT_TEST_ON_RETURN;
        protected boolean _testWhileIdle = GenericObjectPool.DEFAULT_TEST_WHILE_IDLE;
        protected long _timeBetweenEvictionRunsMillis = GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
        protected int _numTestsPerEvictionRun =  GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
        protected long _minEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
        protected long _softMinEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
        protected boolean _lifo = GenericObjectPool.DEFAULT_LIFO;
        protected PoolableObjectFactory _factory = null;
    这个是源码,还有Factory类创建pool
      

  3.   

    dbcp 不好用,我一般都用 c3p0
      

  4.   

    DBCP创建起来耗费时间特别长,一个SessionFactory都要20秒左右,我用的是C3P0,做SSH开发不一定非要用Spring的连接池。
      

  5.   

    能不能介绍下c3p0的代码,比如数据库连接池是单例吗?还有Connection对象是不是同一时间只有一个能连接上数据库
      

  6.   

    提供一些关于连接池中的技术点:1:Connection#close() 的问题,我们执行这个方法时连接池并不会真正意义地关闭与数据库之间的物理连接,而只是将这个连接还回到池中去
    2:数据库服务端会主动断开已经连了很长时间的连接,连接池必须时刻检查池中连接的健康状态,如果有不健康的连接需要抛弃,或者重连
    3:连接池一般有个最大连接数,当达到最大连接数时,使用者再次请求连接,这时连接池需要做些什么事情?
    4:连接池可以通过配置将一些空闲了很久没有用到的连接主动关闭与数据库的通信连接
      

  7.   

    连接池当然不能做成单例的了,连接池一般都实现了 javax.sql.DataSource 接口,因此可以在 JNDI 上为多个数据源提供服务,如果做成单例的话那只能供给一个数据源服务了。但是使用者应该做到一个数据源只实例化一个 DataSource,通过这个 DataSource 来获得连接。
      

  8.   

    连接池设计是这样的:对于连接池设计,一般采用调度,分配,派遣,施行,收回,销毁,六个环节.............连接采用云概念设计,以群的方式管理连接池,我们可以从实际生活中来观察..............例子:污水处理厂在污水处理的过程中,每条入水管道就好比我们使用的连接对象,在污水进入管道后,它的终点应该是一个容器,容器从物理的角度上来说的,那么这个容器就好比我们的POOL对象,容器会有相应的特征,我们帮这些特征抽象为了POOL对象的属性,当污水通过管道流淌到容器中装载这一过程,我们称为“回收”,那在POOL对象中对应的就是第五环节,当污水通过处理的时候,这一步骤也需要特定的管道传送,那在POOL对象中,则表示的是“分配”连接对象,则对应的是第二环节,而污水在流动中的这以行为,我们在POOL对象中对应的则是“派遣”这以环节,当在某特定情况下,比如雨季,大量雨水会通过下水道排放,而有一部分排放则是进入污水处理口,但如果,污水量大于了当前容器的容积,则会通过关闭某一砸门的方式,让污水流入另外一个污水容器中,换句话来说,如果污水处理厂的污水容器就只限定于某一个数量下,那在处理的效率下会大打折扣,所以它会不定时的扩大建筑面积的原因就在这,当一般在建设的时候是已经知道大概要处理多少污水立方的了,那我们来注意几个关键字“砸门”“面积”,“砸门”在我们的POOL中对应的则是“派遣”这一环节,因为我们能评估的只有在压力测试后,最大的连接数是多少,所以最大连接数-当前可用连接数=需要在特殊情况派遣的连接数,“面积”这就是云概念的同俗语,因为在我们的开发中,有时候只让一个对象来处理事务或是充当装载对象,难免会让它吃不消,既然如此,那我们就应该让几个相同能力的对象一起协同工作,这就是为什么会有POLL工厂的原因,我们需要工场帮我们建造出具有相同能力的对象一起工作,这里对应的是“实行”,我们在来看在污水处理厂中,销毁,一般是指过期设备进行报废处理,那这里有个关键字“过期”,什么和过期有关,那就是时间,那很容易理解,在我们的程序中,存在两中原因会导致“销毁”,停止程序,在规定的时间过后,我个人理解就这两种,那工场销毁的东西很多,我们只注意两个,管道,污水池,管道被氧化就需要销毁更换,污水池开裂或是因为某种原因导致无法在用,就得销毁或是修补,那我们的POOL对象中,我根据我们设置的时间条件,来保证与数据库之间能有效传输,超过了,就销毁....
    这是个人理解哈,不代表什么...
      

  9.   

    那一个DataSource是不是只能对应一个数据库池,如果对应多个很不合理啊!我之前的疑惑就是这里,之前觉得数据库池应该是单例的,之所以有个工厂类来创建数据库池应该是为了兼容数据库不同版本吧!大家谈谈自己的看法