Application Server JDBC资源的DataSource或ConnectionPoolDataSource
在应用程序服务器中创建JNDI JDBC连接池时,我总是将类型指定为javax.sql.ConnectionPoolDataSource
。 我从来没有真正给过太多考虑,因为在非汇集时更喜欢汇集连接似乎总是很自然。
但是,在查看一些示例( 特别是Tomcat )时,我注意到它们指定了javax.sql.DataSource
。 此外,似乎有maxIdle
和maxWait
设置给人的印象是这些连接也是合并的。 无论选择何种类型的数据源,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对象池 ….
所以最后你只使用DataSource和Connection类,而不是PooledConnection / ConnectionPoolDataSource ,如果你是一个快乐和正常的程序员。
如果正在实现另一个故事的应用服务器……