在应用服务器环境中,应该更喜欢的javax.sql.DataSource javax.sql.Con

2019-08-01 08:38发布

现有的问题表达了类似的事情,但我想在这里调出一个稍微不同的细微差别。

基本的问题:所有应用服务器给予了(小d,小S)数据源同时指定(标准)接口 (供应商提供)实现类的能力,当你定义一个连接池。 如果供应商提供用于两者的实现ConnectionPoolDataSource和常规醇” DataSource ,其中之一是优选的?

怎么样为实现供应商实现DataSourceConnectionPoolDataSourceXADataSource在同一个实现类?

对于文档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也由应用服务器供应商,谁必须提供一个实现来实现,这样客户端代码可能(例如)注入javax.sql.DataSource成他们的服务器端代码)。 这也似乎暗示着连接池可能会或可能不会被任何给定的被提供DataSource实现,这将让我怀疑的应用程序服务器应该是怎样当一个连接池设置已指定的告诉javax.sql.DataSource接口(而不是javax.sql.ConnectionPoolDataSource接口)。

注:我不是在寻找一个答案约我这是怎么在Tomcat,或者我把对工作对我来说,或者性质的任何GlassFish的步骤在这里。 我在寻找回指向JDBC规范指出为何这些独立(无关!)接口存在的答案,或者Java EE规范,或者错误报告,或什么的,以及它们是如何应该是统一的或卓著因此,之间是有责任提供连接池的通用Java EE应用服务器上。

Answer 1:

你不应该使用ConnectionPoolDataSource直接,它的目的是为物理连接(又名源PooledConnection s)表示,然后使用一个DataSource实际实现连接池。 一个ConnectionPoolDataSource不应该实际执行池本身。

这样的数据源是例如通过您的应用程序服务器提供。 它通常需要JNDI URL(或直接引用)到ConnectionPoolDataSource ,和本身暴露DataSource界面来伸手,“逻辑”连接。

DataSource s的讨论JDBC 4.1节9.4:

DataSource接口[..]对获得的数据源连接的优选的方法。

逻辑名称是通过使用Java命名和目录InterfaceTM(JNDI)的命名服务映射到数据源对象。 DataSource对象,表示物理数据源,并提供该数据源的连接。

如果我们再看看连接池(第11章)在引进指定的描述:

JDBC驱动程序提供的ConnectionPoolDataSource的实现应用程序服务器用来建立和管理连接池。

用于管理连接池的算法是实现特定的,与应用程序服务器不同而不同。 应用服务器为其客户提供了DataSource接口,使连接池对客户透明的实现 。 其结果是,同时使用相同的JNDI和DataSource API,作为之前的客户获得更好的性能和可扩展性。 (重点煤矿)

的(AS)之间的相互作用DataSource :(以下称ASDS)和(驱动程序) ConnectionPoolDataSource - 11.3(以下简称为CPDS)在第11.1中描述。 第11.3节特别描述的相互作用:

的以下步骤序列概述当JDBC客户端请求从实现连接池DataSource对象的连接会发生什么:

  • 客户端调用的DataSource.getConnection。
  • 提供DataSource实现应用服务器查看其连接池中是否有合适的PooledConnection对象 - 提供一个物理数据库连接 - 。 确定给定PooledConnection对象的适用性可以包括匹配客户端的用户的认证信息或应用程序类型,以及使用其他特定于实现的标准。 查找方法,并管理连接池相关的其它方法是特定于应用程序服务器。
  • 如果没有合适的PooledConnection对象可用,应用程序服务器调用ConnectionPoolDataSource.getPooledConnection方法来获取新的物理连接。 JDBC驱动程序实现的ConnectionPoolDataSource创建一个新的PooledConnection对象并返回给应用服务器。
  • 无论是否的PooledConnection从池检索或者是新创建的,应用服务器做了一些内部簿记表明,物理连接现在正在使用中。
  • 应用服务器调用该方法的PooledConnection.getConnection得到一个合理的Connection对象。 这种逻辑连接对象实际上是一个“把手”到物理PooledConnection对象,并且正是该手柄由所述的DataSource.getConnection方法返回当连接池是否有效。
  • 通过调用方法PooledConnection.addConnectionEventListener应用服务器本身注册为ConnectionEventListener。 这样做的目的,当PooledConnection对象是可以重复使用的应用程序服务器将收到通知。
  • 逻辑连接对象返回给JDBC客户机,它使用相同的连接API中的基本数据源的情况下。 需要注意的是,直到客户端调用该方法的Connection.close底层的PooledConnection对象不能被重用。

最后一个项目是并非完全如此:一个ASDS可强制关闭/无效从客户端通过分发新的逻辑连接Connection从同一获得PooledConnection (见第11.4节)。

现在来在评论你的问题:为什么一个AS允许你同时指定DataSourceConnectionPoolDataSource在数据源配置界面:ASDS和社会民主联盟之间的引用通常是通过JNDI要做的事。 例如,这允许容易地重新配置(切换ASDS到不同的底层CPDS,或切换ASDS到正常,基本数据源同时仍然保持CPDS的例如配置,因为它也被用来通过不同的ASDS)。 参见JDBC规范的11.5节:

部署实现连接池DataSource对象需要一个客户端可见的数据源对象和基础ConnectionPoolDataSource对象与基于JNDI的命名服务注册。



Answer 2:

只是为了一些启发:我使用的是Postgres,并从PGConnectionPoolDataSource的API文档是很清楚对我来说:

public class PGConnectionPoolDataSource
extends org.postgresql.ds.jdbc4.AbstractJdbc4ConnectionPoolDataSource
implements javax.sql.ConnectionPoolDataSource

PostgreSQL的实现的ConnectionPoolDataSource的。 应用服务器或中间件厂商应该提供一个DataSource实现,借此ConnectionPoolDataSource的优势。 如果没有, 你可以使用被称为PoolingDataSource PostgreSQL的实现,但应该只被使用,如果您的服务器或中间件供应商不提供自己的。 为什么? 服务器可能要重新使用在所有的EJB相同的连接请求相同的事务中的连接,或提供其他类似的高级功能。



文章来源: In an application server environment, should one prefer javax.sql.DataSource or javax.sql.ConnectionPoolDataSource?
标签: java-ee jdbc