Application Server JDBC资源的DataSource或ConnectionPoolDataSource

时间:2011-06-28 13:03:28

标签: java database configuration connection-pooling application-server

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

  

注意 - 默认数据源支持   在Tomcat中基于DBCP   下议院的连接池   项目。但是,有可能   使用任何其他连接池   实现javax.sql.DataSource,by   编写自己的自定义资源   工厂,如下所述。

挖掘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?format=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?format=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工厂中的池化机制进行比较,无论您使用哪一种。

答案 1 :(得分:5)

我的理解是,ConnectionPoolDataSource的唯一目的是授予对{JDBC}驱动程序实现 native 池的PooledConnection的访问权限。在这种情况下,应用程序服务器可以使用此本机接口实现连接池。

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

不能说哪种方法最好。

答案 2 :(得分:5)

至于Java文档,它包含:

DataSource Java 7 API

  

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

     

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

     

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

     

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

PooledConnection Java 7 API

  

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

     

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

     

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

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

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