为什么使用DataSource而不是XADataSource?
据我了解,有两种类型的DataSource
连接,javax.sql.DataSource
和javax.sql.XADataSource
,this tutorial解释说javax.sql.DataSource
给连接到汇集能力和javax.sql.XADataSource
为连接分布式事务的行为。为什么使用DataSource而不是XADataSource?
我明白最XADataSource
将实现连接池以及分布式事务,所以我不明白这一点使用DataSource
时,你可以使用一个XADataSource
和兼得。
当选择XADataSource
而不是DataSource
时,是否有任何折衷?
我的理解是不强制XADataSource
使用连接池,是有办法找出一个XADataSource
使用连接池或仅依靠XADataSource
提供商的文档吗?
编辑:
我指的javax.sql.DataSource
和javax.sql.XADataSource
,因为这些都是types Tomcat 8
factory gives you:
类型应始终的javax.sql.DataSource或javax.sql.XADataSource中
根据类型a org.apach e.tomcat.jdbc.pool.DataSource或 org.apache.tomcat.jdbc.pool.XADataSource将被创建。
我不明白,到底我会在我的代码作为一个API来使用DataSource
,抽象底层实现...我的问题是关于决策过程更多相关我要经过我的时候我正在配置Tomcat 8
(或其他任何服务器)。
我想拥有池连接,并且有很多XADataSource
实现将提供事务和池连接,所以为什么不总是使用XADataSource
如果我会得到更多? (这当然是不适用的XADataSource
不实现连接池)
当配置XADataSource
如第二部分所述,您的代码将始终使用DataSource
接口(其中可能使用一个XADataSource
)。如果问题是什么时候应该使用XADataSource
(例如在应用程序服务器中配置它),那么答案很简单:
如果您需要分布式事务,则使用XADataSource
:这确保事务成功或失败跨多个资源(例如不同的数据库)。
如果不需要分布式事务,那么你仍然可以配置XADataSource
,但是这可能在存储器和处理方面的一些开销,例如额外的对象(如XAResource
),其被闲置,并可能在条款由数据源完成的“簿记”。尽管这个开销可能微不足道。
一些数据源(例如,在你的问题中提到的Tomcat的池),可以使用一个DataSource
或XADataSource
作为一个工厂来创建连接(根据JDBC规范中的一个ConnectionPoolDataSource
也应该作为一个工厂,但它看起来像Tomcat忽略该选项)。这不会改变你决定使用什么样的方式:
-
不需要分布式事务:
计划--uses - > Tomcat的连接池
DataSource
--uses - > JDBC驱动程序DataSource
-
需要分布式事务:
计划--uses - > Tomcat的连接池
DataSource
--uses - > JDBC驱动程序XADataSource
在这两种情况下,连接池都由Tomcat连接池DataSource
提供,而不是由JDBC驱动程序(XA)DataSource
提供。正确的*XADataSource
的实现将不会实现连接池:这将是使用XADataSource
作为其工厂的DataSource
实现的(可选)责任。所以这不是选择(或不选择)XADataSource
的理由。
您的问题可能来自易混淆的术语,即XADataSource
创建XAConnection
,其延伸PooledConnection
。名称PooledConnection
并不意味着它来自连接池,这意味着创建后这些可以将保存在连接池中(这将在名为XADataSource.getXAConnection
的DataSource
内部)。的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
,XAConnection
和XAResource
接口的JDBC驱动程序。这些将在下一节中介绍。DataSource
的一个应用程序可见实现,以“坐在”每个XADataSource
对象的顶部并与管理器交易 交互。DataSource
实现通常由应用程序服务器提供。- 管理基础数据的资源管理器。在JDBC API的上下文中,资源管理器是DBMS服务器。术语 “资源管理器”是从JTA借用的,以强调使用JDBC API的 分布式事务遵循该文档中指定的体系结构 这一点。
TL; DR:你--USE - >DataSource
- (可能)使用 - >XADataSource
*:历史上出现了各种JDBC实现对于一些混乱责任,并且在某些情况下连接池同时实现了所有三个接口。
我不确定“作为连接的用户”在这里是最有帮助的观点......我觉得这个问题的精神更像是“为什么定义DataSource而不是XADataSource,这在每个方面看起来都很优秀” – Deltharis
@Deltharis我已经添加了一个不同的介绍,但问题在于:'DataSource'是连接用户的接口。 'XADataSource'只是对你隐藏的管道。 –
是的,但是我唯一遇到的选择是在应用程序服务器中定义数据源时。我自己实现应用程序时从来不需要这些知识,因为技术堆栈的某些部分本身处理连接(并且在编写时可能总是使用'DataSource')。在我看来,回答这个问题应该解决定义方面,而不是“连接用户”方面。 – Deltharis
'XADataSource'用于'两阶段'提交以同步不同应用程序实例使用的数据。我只记得在使用'JTAGSource'''XADataSource''的Oracle Oracle ATG Commerce'时,这种区别。 – harshavmb