【发布时间】:2012-10-01 07:53:02
【问题描述】:
An existing question 表达了类似的意思,但我想在这里指出一个稍微不同的细微差别。
基本问题:所有应用程序服务器都能够指定两个(标准)接口和(供应商提供的)实现类(little-d , little-s) 定义连接池时的数据源。如果供应商同时为ConnectionPoolDataSource 和普通的DataSource 提供了实现,那么首选哪一个?
对于在同一个实现类中实现DataSource、ConnectionPoolDataSource 和XADataSource 的供应商实现呢?
javax.sql.ConnectionPoolDataSource 的文档几乎全部说:
PooledConnection 对象的工厂。实现此接口的对象通常会注册到基于 JavaTM 命名和目录接口 (JNDI) 的命名服务。
这基本上没用,但值得注意的是javax.sql.ConnectionPoolDataSource 本身并没有扩展javax.sql.DataSource,这意味着它的实现不需要提供getConnection() 方法,这是大多数调用者习惯使用的方法。这告诉我所有应用程序服务器必须:
-
用
javax.sql.DataSource实现包装javax.sql.ConnectionPoolDataSource实现,以便调用者可以使用javax.sql.DataSource#getConnection(),或者 -
检测到
javax.sql.ConnectionPoolDataSource实现也是javax.sql.DataSource实现,并且(不知何故)相信它的getConnection()方法将委托给getPooledConnection()(他们到底是如何做到这一点的?)
javax.sql.DataSource 的文档部分说:
DataSource 接口由驱动程序供应商实现。实现方式分为三种:
- 基本实现 -- 生成标准 Connection 对象
- 连接池实现——生成一个将自动参与连接池的连接对象。此实现适用于中间层连接池管理器。
- 分布式事务实现——生成一个可用于分布式事务并且几乎总是参与连接池的连接对象。此实现与中间层事务管理器一起使用,并且几乎总是与连接池管理器一起使用。
这也是无用的,并且启动不正确(或至少未指定:javax.sql.DataSource 也由应用程序服务器供应商实现,他们必须提供一个实现,以便客户端代码可以(例如)将javax.sql.DataSource 注入他们的服务器端代码)。这似乎还暗示任何给定的DataSource 实现可能会或可能不会提供连接池,这让我想知道应用程序服务器应该如何判断何时设置了指定javax.sql.DataSource 接口的连接池(而不是javax.sql.ConnectionPoolDataSource 接口)。
注意:我不是在这里寻找关于我是如何在 Tomcat 上做到这一点的,或者我在 GlassFish 上采取的对我有用的步骤或任何类似性质的答案。我正在寻找一个参考 JDBC 规范、Java EE 规范或错误报告的答案,或者表明这些单独(不相关!)接口存在的原因,以及它们应该如何统一或区分的内容在通用 Java EE 应用程序服务器上,因此有义务提供连接池。
【问题讨论】:
-
+1 表示有趣且具体的问题。
标签: jakarta-ee jdbc