一个现有的问题表达了类似的东西,但我想在这里提出一个稍微不同的细微差别.
基本问题:当您定义连接池时,所有应用程序服务器都能够为(little-d,little-s)数据源指定(标准)接口和(供应商提供的)实现类.如果供应商提供a ConnectionPoolDataSource和常规ol'的实现DataSource,哪一个是首选?
怎么样为实现供应商实现DataSource,ConnectionPoolDataSource并XADataSource在同一个实现类?
javax.sql.ConnectionPoolDataSource所说的文档几乎总是如此:
PooledConnection对象的工厂.实现该接口的对象通常将与基于所述的JavaTM命名和目录接口(JNDI)的命名服务注册.
这基本上没用,但值得注意的是,javax.sql.ConnectionPoolDataSource它本身并没有扩展javax.sql.DataSource,这意味着它的实现不需要提供一个getConnection()方法,这是大多数调用者习惯使用的方法.这告诉我所有应用程序服务器必须:
用javax.sql.ConnectionPoolDataSource实现包装实现,javax.sql.DataSource以便调用者可以使用javax.sql.DataSource#getConnection(),或
检测到一个javax.sql.ConnectionPoolDataSource实现也是一个javax.sql.DataSource实现,以及(在某种程度上)的信任,其getConnection()方法将委托给getPooledConnection()(如何在地球上,他们将做到这一点?)
文档javax.sql.DataSource部分说:
DataSource接口由驱动程序供应商实现.有三种类型的实现:
- 基本实现 - 生成标准Connection对象
- 连接池实现 - 生成一个将自动参与连接池的Connection对象.此实现适用于中间层连接池管理器.
- 分布式事务实现 - 生成可用于分布式事务的Connection对象,并且几乎总是参与连接池.此实现与中间层事务管理器一起使用,并且几乎总是与连接池管理器一起使用.
这也是无用的,并且引导不正确(或至少未指定:javax.sql.DataSource也由应用服务器供应商实现,他们必须提供实现,以便客户端代码可以(例如)将a javax.sql.DataSource注入其服务器端代码中).它似乎也暗示任何给定的DataSource实现可能会或可能不会提供连接池,这会让我想知道应用服务器应该如何设置指定javax.sql.DataSource接口(而不是javax.sql.ConnectionPoolDataSource接口)的连接池.
注:我不是在寻找一个答案约我这是怎么在Tomcat,或者我把对工作对我来说,或者性质的任何GlassFish的步骤在这里.我正在寻找一个回答JDBC规范,Java EE规范或错误报告的答案,或者说明为什么存在这些独立(无关!)接口的原因,以及它们应该如何统一或区分在通用Java EE应用程序服务器之间,因此有义务提供连接池.
javax.sql.DataSource和javax.sql.ConnectionPoolDataSource之间有什么区别?当我在 GlassFish for MySQL 中创建连接池时,我不知道要使用哪种资源类型。