数据源或连接池应用程序服务器 JDBC 资源的数据源

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

但是,在查看一些示例(特别是Tomcat)时,我注意到它们指定了.此外,似乎有设置,给人的印象是这些连接也是池化的。Glassfish还允许这些参数,而不管选择的数据源的类型如何。javax.sql.DataSourcemaxIdlemaxWait

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

答案 1

是的,默认情况下,Tomcat 确实对定义为 JNDI 上下文资源的数据源使用 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的源代码显示,他们以这种方式获取连接工厂(以防您不使用上下文的“工厂”属性指定自己的连接工厂):

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

实现javax.nameing.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工厂中的池化机制进行比较,无论您使用哪种机制。


答案 2

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

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

不能说哪种方法是最好的。


推荐