首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用XA数据源和非XA数据源

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

Stack Overflow用户
提问于 2019-01-25 12:37:04
回答 1查看 9.3K关注 0票数 9

我正在尝试理解Java数据资源的使用。但我还是不知道什么时候该用,什么时候不用。

我读过我们使用两个数据库时使用的XA数据资源。但我不知道两个数据库是什么意思。

例如:

我有两层类(服务和DAO)

服务层中的一个被注释为事务的方法,在DAO中调用两个方法。

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-01-25 13:00:26

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

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

如果您想像在一个事务中那样执行这样的操作组合,那么您需要一个分布式事务系统--一个可以将不同系统的事务组合成一个事务的系统。这样,您就可以像代码在单个事务中运行一样编写代码;分布式事务系统会自动提交或回滚底层系统中的事务。

为了使其更加具体:假设您在数据库中插入了一条记录,并将一条消息放在队列中,并且您希望在一个事务中这样做。当将消息放到队列中出现问题时,您还希望回滚数据库事务,以便在数据库中没有记录,而在队列中没有相应的消息。您可以使用分布式事务系统,而不是手动跟踪数据库和队列系统的事务(包括处理所有可能的错误组合)。

XA是用于处理分布式事务的标准。您可以通过Java事务API (JTA)在Java中使用XA事务。Java服务器支持此内置服务器。如果不使用Java服务器,则可以使用实现JTA的单独库,如纳拉亚纳Atomikos

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

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

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

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

只有当您使用多个数据库系统或其他系统,并且希望能够执行跨这些系统的事务时,XA事务才真正有用。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54365485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档