Application Server JDBC资源的DataSource或ConnectionPoolDataSource

Vin*_*nie 24 java database configuration connection-pooling application-server

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

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

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

mvm*_*vmn 8

是的,默认情况下,Tomcat对定义为JNDI上下文资源的DataSource使用Apache DBCP池.

来自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();
Run Code Online (Sandbox Code Playgroud)

实现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中有类别转换异常,因为它们的汇集并没有真正提供javax.sql.ConnectionPoolDataSource的实例,只有javax.sql.DataSource).

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


Ser*_*nov 5

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

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

不能说哪种方法最好.


MrJ*_*mes 5

至于Java文档,它包含:

DataSource Java 7 API

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

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

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

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

PooledConnection Java 7 API

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

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

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

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

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