繁体   English   中英

何时使用XA数据源和非XA数据源

[英]When to Use XA Datasource and Non XA Datasource

我试图了解Java XA数据源的使用。 但是我仍然无法确定何时使用它,何时不使用它。

我读到当我们使用两个数据库时使用的XA数据源。 但是我不确定两个数据库是什么意思。

例如:

我有两层课程(Service和DAO)

服务层中一个被标记为事务的方法,将调用DAO中的两个方法。

DAO中的每个方法都会打开与数据库的新连接,并在方法末尾将其关闭。

如果我使用一个数据库实例,并且DAO中的每个方法都写入不同的表,是否必须使用XA数据源? 因为事务发生在服务层,但仅发生在一个实例数据库中

数据库之类的系统,以及您通过JMS使用的排队系统等,都具有事务的概念。 交易被视为工作单元; 在完成工作(例如在数据库中插入,更新或删除记录)之后,您提交事务,然后数据库确定地完成工作; 或者回滚事务,然后取消事务中完成的所有操作。

在某些情况下,您的软件必须在多个不同的系统上执行操作。 例如,您可能需要将数据插入多个数据库,或在数据库中插入某些内容,然后将消息放入队列中。

如果要像在一个事务中那样进行操作组合,则需要一个分布式事务系统-一种可以将不同系统的事务组合为一个系统的系统。 这样,您可以像在单个事务中运行代码一样编写代码。 分布式交易系统会自动提交或回滚基础系统中的交易。

使其更具体:假设您在数据库中插入一条记录,然后将一条消息放入队列中,并且您希望在一个事务中执行此操作。 当将消息放入队列出了问题时,您还希望回滚数据库事务,以便您在数据库中没有记录,但队列中没有相应的消息。 可以使用分布式事务处理系统来代替手动跟踪数据库和队列系统的事务处理(包括处理所有可能的错误组合)。

XA是用于分布式事务的标准。 您可以通过Java事务API(JTA)使用Java处理 XA事务。 Java EE服务器对此内置组件提供支持。 如果您不使用Java EE服务器,则可以使用单独的实现JTA的库,例如NarayanaAtomikos

DAO中的每个方法都会打开与数据库的新连接,并在方法末尾将其关闭。

通常,这不是编写DAO的方式。 打开数据库连接是一个相对较慢的操作。 如果为在DAO中调用的每个方法打开一个新的数据库连接,则程序最像运行缓慢。 您至少应该使用一个连接池,该池管理多个数据库连接并允许您重用已经打开的连接。

如果我使用一个数据库实例,并且DAO中的每个方法都写入不同的表,是否必须使用XA数据源? 因为事务发生在服务层,但仅发生在一个实例数据库中

如果您的DAO方法各自打开自己的连接,则它们将在单独的事务中运行。 这是否是一个问题取决于您的应用程序需要做什么。 XA数据源不是使它们在一个事务中运行的解决方案。 相反,您都应该让他们使用相同的连接和事务。

XA事务实际上仅在使用多个数据库系统或其他系统并且希望能够执行跨这些系统的事务时才有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM