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.DataSource或javax.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忽略了该选项)。这不会改变您决定使用什么的方式:
数据源
--使用-->JDBC驱动程序数据源
DataSource
--使用-->JDBC驱动程序XADataSource
数据源提供的,而不是由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
由提供发行版的数据源库使用