在应用程序服务器中创建JNDI JDBC连接池时,我始终将类型指定为javax.sql.ConnectionPoolDataSource
。我从来没有真正给过太多考虑,因为在非汇集时更喜欢汇集连接似乎总是很自然。
但是,在查看一些示例(specifically for Tomcat)时,我注意到他们指定了javax.sql.DataSource
。此外,似乎有maxIdle
和maxWait
的设置给人的印象是这些连接也是合并的。无论选择何种类型的数据源,Glassfish都允许使用这些参数。
javax.sql.DataSource
是否在应用程序服务器(或servlet容器)中合并?javax.sql.ConnectionPoolDataSource
而不是javax.sql.DataSource
会有什么(如果有的话)优势?(反之亦然)?答案 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接口由驱动程序供应商实现。有三种类型的实现:
基本实现 - 生成标准的Connection对象
连接池实现 - 生成一个将自动参与连接池的Connection对象。此实现适用于中间层连接池管理器。
分布式事务实现 - 生成可用于分布式事务的Connection对象,并且几乎总是参与连接池。此实现适用于中间层事务管理器,并且几乎总是与连接池管理器一起使用。
应用程序员不直接使用PooledConnection 界面;相反,它由管理连接池的中间层基础结构使用。
当应用程序调用方法DataSource.getConnection时,它会返回一个Connection对象。 如果正在进行连接池,则该Connection对象实际上是PooledConnection对象的句柄,这是一个物理连接。
连接池管理器,通常是应用程序服务器,维护一个PooledConnection 对象池....
所以最后你只需要使用 DataSource 和连接类,而不是 PooledConnection / ConnectionPoolDataSource ,如果你是一个快乐和正常的程序员。
如果要实现另一个故事的应用服务器......