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

时间:2017-05-26 07:32:23

标签: java jdbc datasource connection-pooling

据我所知,有两种类型的DataSource个关联,javax.sql.DataSourcejavax.sql.XADataSourcethis tutorial解释了javax.sql.DataSource赋予连接能力汇集并javax.sql.XADataSource为连接分配事务行为。

我了解大多数XADataSource会实施连接池以及分布式事务,所以当您可以使用DataSource并且拥有XADataSource时,我看不到使用XADataSource的要点两者。

DataSource选择XADataSource时是否有任何权衡?

我理解XADataSource使用池化连接不是强制性的,是否可以找出XADataSource是使用池化连接还是只依赖javax.sql.DataSource提供商&# 39;文件?

编辑:

我引用的是javax.sql.XADataSourceDataSource,因为这些是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}})

1 个答案:

答案 0 :(得分:7)

何时配置XADataSource

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

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

如果您不需要分布式事务,那么您仍然可以配置XADataSource,但这可能会在内存和处理方面产生一些开销,例如额外的对象(例如XAResource那些未被使用过的,也许是在“簿记”方面。由数据源完成。但这个开销可能微不足道。

某些数据源(例如问题中提到的Tomcat池)可以使用DataSourceXADataSource作为工厂来创建连接(根据JDBC规范{{1也应该可以作为工厂使用,但看起来Tomcat忽略了该选项)。这并没有改变您决定使用方式的方式:

  1. 不需要分发交易:

    计划 - 用途 - > Tomcat连接池ConnectionPoolDataSource --uses - > JDBC驱动程序DataSource

  2. 需要分发交易:

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

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

    您的问题可能源于XADataSource创建的XADataSource令人困惑的术语,XAConnection扩展了PooledConnection。名称PooledConnection并不意味着它来自连接池,这意味着创建后这些可以保存在连接池中(这将位于{{1}内部那叫做DataSource)。

    XADataSource.getXAConnectionDataSource

    的责任

    在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()XADataSourceXAConnection接口的JDBC驱动程序。这些将在下一节中介绍。
    •   
    • 应用程序可见的XAResource实现“位于”每个DataSource对象之上并与事务交互   经理。 XADataSource实现通常由a提供   应用服务器。
    •   
    • 用于管理基础数据的资源管理器。在JDBC API的上下文中,资源管理器是DBMS服务器。术语   “资源管理者”是从JTA借来强调的   使用JDBC API的分布式事务遵循该体系结构   在该文件中指明。
    •   

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

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