据我所知,有两种类型的DataSource
个关联,javax.sql.DataSource
和javax.sql.XADataSource
,this tutorial解释了javax.sql.DataSource
赋予连接能力汇集并javax.sql.XADataSource
为连接分配事务行为。
我了解大多数XADataSource
会实施连接池以及分布式事务,所以当您可以使用DataSource
并且拥有XADataSource
时,我看不到使用XADataSource
的要点两者。
在DataSource
选择XADataSource
时是否有任何权衡?
我理解XADataSource
使用池化连接不是强制性的,是否可以找出XADataSource
是使用池化连接还是只依赖javax.sql.DataSource
提供商&# 39;文件?
编辑:
我引用的是javax.sql.XADataSource
和DataSource
,因为这些是types Tomcat 8
factory gives you:
类型应始终为 javax.sql.DataSource 或 javax.sql.XADataSource
取决于org.apache.tomcat.jdbc.pool.DataSource或a的类型 将创建org.apache.tomcat.jdbc.pool.XADataSource。
我明白最后我会在我的代码上使用Tomcat 8
作为API,抽象底层实现......我的问题与我必须经历的决策过程有关我正在配置XADataSource
(或任何其他服务器)。
我想要汇集连接,并且有许多XADataSource
实现将提供事务和池连接,那么为什么不总是使用XADataSource
如果我会得到更多? (这当然不适用于没有实现池化连接的{{1}})
答案 0 :(得分:7)
XADataSource
如第二部分所述,您的代码将始终使用DataSource
接口(可能使用XADataSource
)。如果问题是您何时应该使用XADataSource
(例如在应用程序服务器中配置它),那么答案很简单:
如果您需要分布式事务,则使用XADataSource
:这可确保事务在多个资源(例如,不同的数据库)之间成功或失败。
如果您不需要分布式事务,那么您仍然可以配置XADataSource
,但这可能会在内存和处理方面产生一些开销,例如额外的对象(例如XAResource
那些未被使用过的,也许是在“簿记”方面。由数据源完成。但这个开销可能微不足道。
某些数据源(例如问题中提到的Tomcat池)可以使用DataSource
或XADataSource
作为工厂来创建连接(根据JDBC规范{{1也应该可以作为工厂使用,但看起来Tomcat忽略了该选项)。这并没有改变您决定使用方式的方式:
不需要分发交易:
计划 - 用途 - > Tomcat连接池ConnectionPoolDataSource
--uses - > JDBC驱动程序DataSource
需要分发交易:
计划 - 用途 - > Tomcat连接池DataSource
--uses - > JDBC驱动程序DataSource
在这两种情况下,连接池都由Tomcat连接池XADataSource
提供,而不是由JDBC驱动程序DataSource
提供。 (XA)DataSource
的正确 * 实现不会实现连接池:这将是使用XADataSource
作为其工厂的DataSource
实现的(可选)责任。因此,这不是选择(或不选择)XADataSource
的理由。
您的问题可能源于XADataSource
创建的XADataSource
令人困惑的术语,XAConnection
扩展了PooledConnection
。名称PooledConnection
并不意味着它来自连接池,这意味着创建后这些可以保存在连接池中(这将位于{{1}内部那叫做DataSource
)。
XADataSource.getXAConnection
和DataSource
在JDBC中,XADataSource
的职责是创建可供应用程序使用的连接。这意味着它可以是一个非常基本的实现,除了直接转到DataSource
之外,还可以提供连接池,并支持分布式事务。
我们的想法是,您可以将一个实现替换为另一个实现,而您的代码将不受影响。
因此,消耗连接的代码应始终使用DriverManager
实现。 javax.sql.DataSource
(和javax.sql.XADataSource
就此而言)旨在由提供连接池和/或分布式事务等高级功能的javax.sql.ConnectionPoolDataSource
实现使用。它们不应该直接用在您自己的程序中。正如你链接的教程所说:
类似地,当实现
javax.sql.DataSource
实现以使用DataSource
类时,它生成的所有连接将自动成为可在分布式事务中使用的连接。
换句话说,XADataSource
是用于获取连接的API,而DataSource
由提供分布式事务支持的数据源库使用。它获取XADataSource
,将其注册到分布式事务管理器,然后为您提供从XAConnection
获得的逻辑连接。
这也是JDBC 4.2规范第12.1节中描述的:
分布式事务需要提供这些的基础结构 作用:
- 事务管理器 - 控制事务边界并管理两阶段提交协议。这通常是一个 实施JTA。
- 实现
XAConnection.getConnection()
,XADataSource
和XAConnection
接口的JDBC驱动程序。这些将在下一节中介绍。- 应用程序可见的
XAResource
实现“位于”每个DataSource
对象之上并与事务交互 经理。XADataSource
实现通常由a提供 应用服务器。- 用于管理基础数据的资源管理器。在JDBC API的上下文中,资源管理器是DBMS服务器。术语 “资源管理者”是从JTA借来强调的 使用JDBC API的分布式事务遵循该体系结构 在该文件中指明。
TL; DR:你 - 使用 - > DataSource
- (可能)使用 - > DataSource
*:从历史上看,各种JDBC实现中存在一些关于职责的混淆,在某些情况下,连接池同时实现了所有三个接口。