为什么要使用DataSource而不是XADataSource?

mFe*_*ein 8 java datasource connection-pooling jdbc

据我所知,有两种类型的DataSource连接,javax.sql.DataSource并且javax.sql.XADataSource,本教程解释了javax.sql.DataSource为连接提供了池化的能力,并javax.sql.XADataSource为连接提供了分布式事务行为.

我理解大多数XADataSource都会实现连接池以及分布式事务,所以我没有看到使用a的DataSource时候你可以使用a XADataSource并同时拥有它们.

选择XADataSource超过a 时是否有任何权衡DataSource

我理解XADataSource使用池化连接不是强制性的,是否有办法找出是XADataSource使用池连接还是只依赖XADataSource提供者的文档?


编辑:

我指的javax.sql.DataSourcejavax.sql.XADataSource,因为这些都是类型的Tomcat 8工厂给你:

Type应始终为javax.sql.DataSourcejavax.sql.XADataSource

根据类型,将创建org.apache.tomcat.jdbc.pool.DataSource或org.apache.tomcat.jdbc.pool.XADataSource.

我明白最终我将使用DataSource我的代码作为API,抽象底层实现...我的问题与我在配置时要经历的决策过程Tomcat 8(或任何其他服务器)更相关以及).

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

Mar*_*eel 7

何时配置 XADataSource

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

您可以使用的XADataSource,如果你需要有分布式事务:那就是确保交易成功或跨越多个资源的失败(如不同的数据库).

如果您不需要分布式事务,那么您仍然可以配置一个XADataSource,但是这可能在内存和处理方面有一些开销,例如XAResource未使用的额外对象(例如),也可能是在"簿记"方面由数据源.但这个开销可能微不足道.

一些数据源(例如你问题中提到的Tomcat池)可以使用a DataSource或者XADataSource作为工厂来创建连接(根据JDBC规范,a ConnectionPoolDataSource也应该作为工厂提供,但看起来Tomcat忽略了该选项) ).这不会改变您决定使用方式的方式:

  1. 不需要分布式事务:

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

  2. 需要分发交易:

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

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

您的问题可能源于XADataSource创建XAConnection扩展的令人困惑的术语PooledConnection.这个名称PooledConnection并不意味着它来自连接池,它意味着在创建之后这些可以保存在连接池中(这将在被DataSource调用的内部XADataSource.getXAConnection).

DataSource和的责任XADataSource

在JDBC中,a的职责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的实现.
  • JDBC驱动程序实现的XADataSource,XAConnectionXAResource接口.这些将在下一节中介绍.
  • 应用程序可见的实现,DataSource以"坐在"每个XADataSource对象之上并与事务管理器进行交互.该DataSource实现通常由应用程序服务器提供.
  • 资源管理器来管理底层数据.在JDBC API的上下文中,资源管理器是DBMS服务器.术语"资源管理器"是从JTA借用的,以强调使用JDBC API的分布式事务遵循该文档中指定的体系结构.

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


*:历史上,各种JDBC实现中存在一些关于职责的混淆,在某些情况下,连接池同时实现了所有三个接口.