Application Server JDBC资源的DataSource或ConnectionPoolDataSource

在应用程序服务器中创建JNDI JDBC连接池时,我总是将类型指定为javax.sql.ConnectionPoolDataSource 。 我从来没有真正给过太多考虑,因为在非汇集时更喜欢汇集连接似乎总是很自然。

但是,在查看一些示例( 特别是Tomcat )时,我注意到它们指定了javax.sql.DataSource 。 此外,似乎有maxIdlemaxWait设置给人的印象是这些连接也是合并的。 无论选择何种类型的数据源,Glassfish都允许使用这些参数。

  • javax.sql.DataSource是否在应用程序服务器(或servlet容器)中池化?
  • javax.sql.DataSource选择javax.sql.ConnectionPoolDataSource有什么优点(如果有的话)(反之亦然)?

是的,Tomcat默认使用Apache DBCP池来定义为JNDI Context资源的DataSource。

来自http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#JDBC_Data_Sources上的文档

注 – Tomcat中的默认数据源支持基于Commons项目的DBCP连接池。 但是,可以通过编写自己的自定义资源工厂来使用实现javax.sql.DataSource的任何其他连接池,如下所述。

挖掘Tomcat 6源代码显示他们以这种方式获取连接工厂(如果您没有使用Context的“factory”属性指定自己的工厂):

 ObjectFactory factory = (ObjectFactory)Class.forName(System.getProperty("javax.sql.DataSource.Factory", "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory")).newInstance(); 

实现javax.naming.spi.ObjectFactory的org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory负责创建DataSource实例: http : //www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat- DBCP / 7.0.2 / Tomcat的DBCP-7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/BasicDataSourceFactory.java?格式= OK

我看到他们创建了org.apache.tomcat.dbcp.dbcp.BasicDataSource的实例: http : //www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat-dbcp/7.0.2/tomcat-dbcp- 7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/BasicDataSource.java?格式= OK

奇怪的是,这个类本身并没有实现ConnectionPoolDataSource,org.apache.tomcat.dbcp.dbcp.PoolingDataSource也没有实现,它是由BasicDataSource内部返回的http://www.jarvana.com/jarvana/view/org/apache/tomcat /tomcat-dbcp/7.0.2/tomcat-dbcp-7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/PoolingDataSource.java?format=ok

所以我假设当你将你的DataSources配置为javax.sql.ConnectionPoolDataSource时,你也使用了一些自定义工厂(这只是一个猜测,但我想如果你在Tomcat中有类别转换exception,因为它们的汇集并没有真正提供javax.sql.ConnectionPoolDataSource的实例,只有javax.sql.DataSource)。

因此,要回答有关特定情况的优缺点的问题,您应该将Apache DBCP与DataSource工厂中的池化机制进行比较,无论您使用哪一种。

我的理解是, ConnectionPoolDataSource唯一目的是提供对通过JDBC驱动程序实现本机池的PooledConnection访问。 在这种情况下,应用程序服务器可以使用此本机接口实现连接池。

使用简单的DataSource ,appserver使用自己的池而不是本机池。

不能说哪种方法最好。

至于Java文档,它包含:

DataSource Java 7 API

DataSource接口由驱动程序供应商实现。 有三种类型的实现:

基本实现 – 生成标准Connection对象

连接池实现 – 生成将自动参与连接池的Connection对象。 此实现适用于中间层连接池管理器。

分布式事务实现 – 生成可用于分布式事务的Connection对象,并且几乎总是参与连接池。 此实现与中间层事务管理器一起使用,并且几乎总是与连接池管理器一起使用。

PooledConnection Java 7 API

应用程序员不直接使用PooledConnection接口; 相反,它由管理连接池的中间层基础结构使用。

当应用程序调用方法DataSource.getConnection时,它会返回一个Connection对象。 如果正在进行连接池,则该Connection对象实际上是PooledConnection对象的句柄,该对象是物理连接。

连接池管理器 (通常是应用程序服务器) 维护一个PooledConnection对象 ….

所以最后你只使用DataSourceConnection类,而不是PooledConnection / ConnectionPoolDataSource ,如果你是一个快乐和正常的程序员。

如果正在实现另一个故事的应用服务器……