为什么使用DataSource而不是XADataSource?

为什么使用DataSource而不是XADataSource?

问题描述:

据我了解,有两种类型的DataSource连接,javax.sql.DataSourcejavax.sql.XADataSourcethis tutorial解释说javax.sql.DataSource给连接到汇集能力和javax.sql.XADataSource为连接分布式事务的行为。为什么使用DataSource而不是XADataSource?

我明白最XADataSource将实现连接池以及分布式事务,所以我不明白这一点使用DataSource时,你可以使用一个XADataSource和兼得。

当选择XADataSource而不是DataSource时,是否有任何折衷?

我的理解是不强制XADataSource使用连接池,是有办法找出一个XADataSource使用连接池或仅依靠XADataSource提供商的文档吗?


编辑:

我指的javax.sql.DataSourcejavax.sql.XADataSource,因为这些都是types Tomcat 8 factory gives you

类型应始终的javax.sql.DataSourcejavax.sql.XADataSource中

根据类型a org.apach e.tomcat.jdbc.pool.DataSource或 org.apache.tomcat.jdbc.pool.XADataSource将被创建。

我不明白,到底我会在我的代码作为一个API来使用DataSource,抽象底层实现...我的问题是关于决策过程更多相关我要经过我的时候我正在配置Tomcat 8(或其他任何服务器)。

我想拥有池连接,并且有很多XADataSource实现将提供事务和池连接,所以为什么不总是使用XADataSource如果我会得到更多? (这当然是不适用的XADataSource不实现连接池)

+0

'XADataSource'用于'两阶段'提交以同步不同应用程序实例使用的数据。我只记得在使用'JTAGSource'''XADataSource''的Oracle Oracle ATG Commerce'时,这种区别。 – harshavmb

当配置XADataSource

如第二部分所述,您的代码将始终使用DataSource接口(其中可能使用一个XADataSource)。如果问题是什么时候应该使用XADataSource(例如在应用程序服务器中配置它),那么答案很简单:

如果您需要分布式事务,则使用XADataSource:这确保事务成功或失败跨多个资源(例如不同的数据库)。

如果不需要分布式事务,那么你仍然可以配置XADataSource,但是这可能在存储器和处理方面的一些开销,例如额外的对象(如XAResource),其被闲置,并可能在条款由数据源完成的“簿记”。尽管这个开销可能微不足道。

一些数据源(例如,在你的问题中提到的Tomcat的池),可以使用一个DataSourceXADataSource作为一个工厂来创建连接(根据JDBC规范中的一个ConnectionPoolDataSource也应该作为一个工厂,但它看起来像Tomcat忽略该选项)。这不会改变你决定使用什么样的方式:

  1. 不需要分布式事务:

    计划--uses - > Tomcat的连接池DataSource --uses - > JDBC驱动程序DataSource

  2. 需要分布式事务:

    计划--uses - > Tomcat的连接池DataSource --uses - > JDBC驱动程序XADataSource

在这两种情况下,连接池都由Tomcat连接池DataSource提供,而不是由JDBC驱动程序(XA)DataSource提供。正确的*XADataSource的实现将不会实现连接池:这将是使用XADataSource作为其工厂的DataSource实现的(可选)责任。所以这不是选择(或不选择)XADataSource的理由。

您的问题可能来自易混淆的术语,即XADataSource创建XAConnection,其延伸PooledConnection。名称PooledConnection并不意味着它来自连接池,这意味着创建后这些可以将保存在连接池中(这将在名为XADataSource.getXAConnectionDataSource内部)。的DataSource

职责和XADataSource

JDBC中DataSource的责任是创造,可以由应用程序使用的连接。这意味着它可以是一个非常基本的实现,只不过是直接去DriverManager,而且是一个提供连接池的实现,并支持分布式事务。

这个想法是,你可以交换一个实现为另一个,而你的代码将保持不变。

因此,消费连接的代码应始终使用javax.sql.DataSource实现。 javax.sql.XADataSource(和javax.sql.ConnectionPoolDataSource就此而言)旨在供提供高级功能(如连接池和/或分布式事务)的javax.sql.DataSource实现使用。他们不应该直接用在你自己的程序中。当你链接的教程说:

同样,当DataSource实现实现与XADataSource类工作,所有它产生的连接将被自动可在分布式事务中使用连接。

换句话说DataSource是使用以获得连接的API和一个XADataSource使用由提供分布式事务支持一个数据源库。它获得XAConnection,将其注册到分布式事务管理器,然后为您提供从XAConnection.getConnection()获得的逻辑连接。

这也是在JDBC 4.2规范中描述,12.1节:

分布式事务需要提供这些 角色的基础设施:

  • 事务管理器 - 控制事务边界和管理两阶段提交协议。这通常是JTA的 实施。
  • 实现XADataSource,XAConnectionXAResource接口的JDBC驱动程序。这些将在下一节中介绍。
  • DataSource的一个应用程序可见实现,以“坐在”每个XADataSource对象的顶部并与管理器交易 交互。 DataSource实现通常由应用程序服务器提供。
  • 管理基础数据的资源管理器。在JDBC API的上下文中,资源管理器是DBMS服务器。术语 “资源管理器”是从JTA借用的,以强调使用JDBC API的 分布式事务遵循该文档中指定的体系结构 这一点。

TL; DR:你--USE - >DataSource - (可能)使用 - >XADataSource


*:历史上出现了各种JDBC实现对于一些混乱责任,并且在某些情况下连接池同时实现了所有三个接口。

+0

我不确定“作为连接的用户”在这里是最有帮助的观点......我觉得这个问题的精神更像是“为什么定义DataSource而不是XADataSource,这在每个方面看起来都很优秀” – Deltharis

+0

@Deltharis我已经添加了一个不同的介绍,但问题在于:'DataSource'是连接用户的接口。 'XADataSource'只是对你隐藏的管道。 –

+0

是的,但是我唯一遇到的选择是在应用程序服务器中定义数据源时。我自己实现应用程序时从来不需要这些知识,因为技术堆栈的某些部分本身处理连接(并且在编写时可能总是使用'DataSource')。在我看来,回答这个问题应该解决定义方面,而不是“连接用户”方面。 – Deltharis