【问题标题】:DataSource or ConnectionPoolDataSource for Application Server JDBC resources应用程序服务器 JDBC 资源的 DataSource 或 ConnectionPoolDataSource
【发布时间】:2011-09-24 07:29:49
【问题描述】:

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

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

  • javax.sql.DataSource 是否汇集在应用服务器(或 servlet 容器)中?
  • javax.sql.DataSource 相比,选择javax.sql.ConnectionPoolDataSource 有哪些(如果有)优势(反之亦然)?

【问题讨论】:

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


【解决方案1】:

是的,默认情况下,Tomcat 确实对定义为 JNDI 上下文资源的数据源使用 Apache DBCP 池。

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

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

挖掘 Tomcat 6 的源代码显示他们以这种方式获取连接工厂(以防您没有使用 Context 的“工厂”属性指定自己的):

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 中出现类转换异常,因为它们的池没有t确实提供了javax.sql.ConnectionPoolDataSource的实例,只有javax.sql.DataSource)。

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

【讨论】:

  • 对。实际上我只在 Glassfish 中配置了 ConnectionPoolDataSource 并指定了它的 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource。感谢您提供的所有重要信息!
  • 不客气。请投票/注明为正确答案(-:
【解决方案2】:

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

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

不能说哪种方法最好。

【讨论】:

    【解决方案3】:

    至于 Java 文档,它包含以下内容:

    DataSource Java 7 API

    DataSource 接口由驱动程序供应商实现。实现方式分为三种:

    基本实现——产生一个标准的连接对象

    连接池实现——生成一个连接对象,该对象将自动参与连接池。此实现与中间层连接池管理器一起使用。

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

    PooledConnection Java 7 API

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

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

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

    因此,如果您是一个快乐而普通的程序员,那么最终您只需使用 DataSourceConnection 类,而不要使用 PooledConnection / ConnectionPoolDataSource

    如果要实现一个应用服务器,那就另当别论了……

    【讨论】:

    • 这是正确的,但不能回答问题。作为 of 的调用者,例如DataSource#getConnection() 你是对的:这是调用者与应用服务器提供的连接池交互的唯一方式。但是作为首先设置池的管理员(这就是这个问题所要问的),它实际上是完全未指定的。见stackoverflow.com/questions/12826191/…
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2011-01-15
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多