Java 为什么使用DataSource而不是Xadasource?

Java 为什么使用DataSource而不是Xadasource?,java,jdbc,datasource,connection-pooling,Java,Jdbc,Datasource,Connection Pooling,据我所知,有两种类型的DataSource连接,javax.sql.DataSource和javax.sql.XADataSource,说明javax.sql.DataSource赋予连接池化的能力,并javax.sql.XADataSource赋予连接分布式事务行为 我知道大多数XADataSource都将实现连接池和分布式事务,因此我不认为当您可以使用XADataSource并同时拥有这两种资源时,使用DataSource有什么意义 在选择XADataSource而不是DataSource时

据我所知,有两种类型的
DataSource
连接,
javax.sql.DataSource
javax.sql.XADataSource
,说明
javax.sql.DataSource
赋予连接池化的能力,并
javax.sql.XADataSource
赋予连接分布式事务行为

我知道大多数
XADataSource
都将实现连接池和分布式事务,因此我不认为当您可以使用
XADataSource
并同时拥有这两种资源时,使用
DataSource
有什么意义

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

我知道
XADataSource
使用池连接不是强制性的,有没有办法确定
XADataSource
是使用池连接还是仅依赖
XADataSource
提供商的文档


编辑:

我指的是
javax.sql.DataSource
javax.sql.XADataSource
,因为它们是:

类型应始终为javax.sql.DataSourcejavax.sql.XADataSource

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

我知道最终我会在我的代码上使用
数据源
作为API,抽象底层实现。。。我的问题与配置
tomcat8
(或任何其他服务器)时必须经历的决策过程更相关

我希望有池连接,并且有许多
XADataSource
实现将提供事务性和池连接,所以如果我想获得更多,为什么不总是使用
XADataSource
?(这当然不适用于未实现池连接的
XADataSource

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

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

如果您不需要分布式事务,那么您仍然可以配置
XADataSource
,但这可能会在内存和处理方面产生一些开销,例如未使用的额外对象(例如
XAResource
),也可能是在数据源执行的“记账”方面。不过,这种开销可能可以忽略不计

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

  • 不需要分布式事务:

    程序--使用-->Tomcat连接池
    数据源
    --使用-->JDBC驱动程序
    数据源

  • 需要分布式事务:

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

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

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

    DataSource
    XADataSource
    在JDBC中,
    数据源的职责是创建应用程序可以使用的连接。这意味着它可以是一个非常基本的实现,只需直接转到
    DriverManager
    ,也可以是一个提供连接池和分布式事务支持的实现

    其思想是,您可以将一个实现替换为另一个实现,而您的代码将不会受到影响

    因此,使用代码的连接应该始终使用
    javax.sql.DataSource
    实现。
    javax.sql.XADataSource
    (以及
    javax.sql.ConnectionPoolDataSource
    )旨在供提供连接池和/或分布式事务等高级功能的
    javax.sql.DataSource
    实现使用。它们不应直接用于您自己的程序中。正如您链接的教程所述:

    类似地,当实现
    DataSource
    实现以与
    XADataSource
    类一起工作时,它生成的所有连接将自动成为可在分布式事务中使用的连接


    换句话说,
    DataSource
    是用于获取连接的API,
    XADataSource
    由提供发行版的数据源库使用