DataBase Connection Pool,数据库连接池,是apache开发的一个对数据库连接对象的一个封装组件,通过dbcp来管理程序与数据库之间的连接,程序通过dbcp来取得连接而不再直接建立与数据库的连接
成都创新互联公司不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的网站设计、网站建设质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式成都营销网站建设需求,让再小的高端网站设计也能产生价值!
首先,明确连接、活动连接(连接正被使用)、空闲连接的概念
一、创建连接
1、初始化 2、空闲连接低于最小空闲minIdle
二、销毁连接
1、空闲连接数目高于最大空闲 2、活动连接被遗弃
三、回收行为
1、空闲连接回收器(定时执行)2、连接回收器(maxwait后触发)
initialSize 初始化连接数,即连接池启动时池子中的连接数目
maxActive 最大活动连接数,即连接池中可同时连接的最大数目
minIdle 最小空闲连接,连接池中最少的空闲的连接数,
低于这个数量时,意味着连接不够用了,会被创建新的连接
默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;
不宜太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置。
maxIdle 最大空闲连接
超过此参数时空闲连接将被释放,如果设置为负数表示不限制
默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置。
maxIdle 最大空闲连接
超过此参数时空闲连接将被释放,如果设置为负数表示不限制
默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置
maxWait 请求连接时,最长的等待时间。
单位ms,当没有可用连接时,连接池会等待连接释放,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限)。
直接写 myDataSource= BasicDataSourceFactory.createDataSource(prop);
编译会报错么?
另外你使用的dbcp是什么版本?
我的1.4版本是正常的。
1,连接池创建
BasicDataSource - DataSource
@Override
public Connection getConnection()
【a】createDataSource()
如果dataSource不为空,则返回数据源对象,否则创建之,如下:
【1】createConnectionFactory()
(a)通过配置参数property name="driverClassName" value="${jdbc.driver}" /,加载驱动类Class.forName(driverClassName);
(b)通过配置参数property name="url" value="${jdbc.url}" /,获取驱动DriverManager.getDriver(url);
(c)通过配置参数property name="username" value="${jdbc.username}" /,property name="password" value="${jdbc.password}" /,
以及driver,url,创建数据库连接工厂new DriverConnectionFactory(driver, url, connectionProperties);
【2】createConnectionPool()
(a)通过配置参数:property name="maxActive" value="${dbcp.maxActive}" /
property name="maxIdle" value="${dbcp.maxIdle}" /
property name="minIdle" value="${dbcp.minIdle}" /
等配置项,创建连接池org.apach.commons.pool.impl.GenericObjectPool connectionPool
commons-dbcp本身不创建连接池,通过commons-pool来管理连接池
(b)GenericObjectPool.addObject()中调用下步创建的连接池工厂类,创建连接,并通过addObjectToPool(obj, false);将连接保存在连接池
【4】createPoolableConnectionFactory(driverConnectionFactory, statementPoolFactory, abandonedConfig)
(a)创建连接池工厂类PoolableConnectionFactory,工厂类内部将该工厂设置到上步创建的connectionPool中,这样就可以通过connectionPool中的addObject()调用连接池工厂创建连接
【5】createDataSourceInstance()
(a)根据连接池connectionPool创建池化数据源对象 PoolingDataSource pds = new PoolingDataSource(connectionPool)
【6】初始化连接
for (int i = 0 ; i initialSize ; i++) {
connectionPool.addObject();
}
【7】返回池化数据库连接对象dataSource
【b】getConnection()
【1】_pool.borrowObject();调用【a】-【2】创建的连接池创建连接
(a)_factory.makeObject();调用【a】-【4】创建的连接池工厂类对象,返回new PoolableConnection(conn,_pool,_config);对象
其中PoolableConnection持有【a】-【2】创建的连接池_pool,当PoolableConnection.close()时,该连接会被_pool回收,_pool.returnObject(this);