DBCP 连接池的理解
来源:互联网 发布:ubuntu dd u盘启动盘 编辑:程序博客网 时间:2024/05/16 08:15
Apache的commons-pool提供了编写对象池的API,将用完的对象返回对象池中以便于下次利用,从而减少了对象创建时间。这对于创建对象相对耗时的应用来说,能够提高应用的性能。
commons-dbcp数据库连接池正是使用commons-pool来创建和数据库之间的连接对象,在对象池中保存这些对象,从而减少了频繁建立连接对象所造成的性能损耗。本文讲述了commons-dbcp是怎样利用commons-pool来建立对象池的。
例如在tomcat中,利用JNDI来查找到资源javax.sql.DataSource的实现,如果使用dbcp连接池,则该实现为org.apache.commons.dbcp.BasicDataSource。我们可以从这个称为“数据源”的类中调用getConnection方法来获得与数据库的连接。但内部是如何实现的呢?对象池在其中占据什么位置呢?这一切对于外部使用者来说是透明的。
BasicDataSource的getConnection首先建立了PoolingDataSource对象来getConnection。这个PoolingDataSource对象中引用了ObjectPool,在getConnection()时,是从ObjectPool中借用了一个对象,既调用ObjectPool.borrowObject()方法。而对于熟悉commons-pool的程序员来说,ObjectPool肯定有与之对应的Factory创建对象,并放到池中。因此dbcp通过实现了接口org.apache.commons.pool.PoolableObjectFactory的类org.apache.commons.dbcp.PoolableConnectionFactory的makeObject方法来创建连接Connection对象。然而PoolableConnectionFactory持有对ConnectionFactory的引用,ConnectionFactory可以有3种策略来创建Connection对象。其中DriverConnectionFactory调用了数据库厂商提供的Driver来获得Connection。如图所示。
在创建连接时,是创建的DelegatingConnection实例,该对象持有对池的引用,对于java.sql.Connectionl.close()方法来说是调用的对象池的returnObject方法来返回池,而不是真正的把连接关掉。而我们在外界调用这个方法时,并未发现这一点。而对于调用Connection的其他方法而言,都是委派到由Driver得到的Connection相对应的方法。即PoolableConnection-->Connection,前者实现了DelegatingConnection。
在用dbcp连接池的时候,若设置了poolPreparedStatements属性为true,则PoolableConnectionFactory在makeObject时,建立的连接存在的委派关系如下:PoolableConnection-->PoolingConnection-->Connection。PoolingConnection实现了KeyedPoolableObjectFactory,从而为与之对应的对象池keyedObjectPool形成双向关联。在对象池中,以PStmtKey(包含有sql等属性)来标示该池中的一类对象。因此在使用dbcp连接池时,若配置了poolPreparedStatements属性,注意尽量保持相同功能的sql写法一致,来充分利用对象池。
- DBCP 连接池的理解
- DBCP连接池的配置
- DBCP连接池的使用
- 连接池DBCP的使用
- tomcat5.5的DBCP连接池配置
- commons-dbcp连接池的分析
- 关于dbcp连接池的一个工具
- tomcat7 的dbcp连接池配置问题
- 基于Apache的DBCP建立连接池
- DBCP连接池的使用小结
- DBCP连接池TestOnBorrow的坑
- dbcp连接池实现
- DBCP连接池使用
- DBCP连接池详解
- DBCP连接池
- DBCP 连接池参数
- 使用dbcp 连接池
- DBCP 连接池
- 在module中使用Alert出错
- JBPM与设计模式之职责链模式
- WinForm换肤操作(用IrisSkin2.dll)
- mysql不能插入中文的解决办法
- 简单的读写Properties操作
- DBCP 连接池的理解
- 基数排序
- sql server日志增长原因定位
- 四种连接数据库的方法
- C#操作INI文件
- Jquery跳出each循环
- 快速排序
- C#中简单的正则表达式(也经常会用到的)
- C#中简单的正则表达式(也经常会用到的)