我试图了解Java XA数据源的使用。 但是我仍然无法确定何时使用它,何时不使用它。
我读到我们使用两个数据库时使用的XA数据源。 但是我不确定两个数据库是什么意思。
例如:
我有两类课程(Service和DAO)
在服务层中被注释为事务的方法,在DAO中调用两个方法。
DAO中的每个方法都会打开与数据库的新连接,并在方法末尾将其关闭。
如果我使用一个数据库实例,并且DAO中的每个方法都写入不同的表,我是否必须使用XA数据源?因为交易发生在服务层,但只发生在一个实例数据库中
答案 0 :(得分:2)
诸如数据库之类的系统,以及例如通过JMS使用的排队系统,都具有transactions的概念。交易被视为工作单元;在完成工作(例如在数据库中插入,更新或删除记录)之后,您提交事务,然后数据库确定地完成工作;否则您回滚该事务,然后该事务中完成的所有操作都将被取消。
在某些情况下,您的软件必须在多个不同的系统上执行操作。例如,您可能需要将数据插入到多个数据库中,或者在数据库中插入某些内容并将消息放入队列中。
如果要像在一个事务中那样进行操作组合,则需要一个分布式事务系统-一种可以将不同系统的事务合并为一个系统的系统。这样,您可以像在单个事务中运行代码一样编写代码。分布式交易系统会自动提交或回滚基础系统中的交易。
更具体地讲:假设您在数据库中插入一条记录,然后将一条消息放入队列中,并且您想在一个事务中执行此操作。当将消息放入队列出了问题时,您还希望回滚数据库事务,以便您在数据库中没有记录,但队列中没有相应的消息。您可以使用分布式事务处理系统来代替手动跟踪数据库和队列系统的事务处理(包括处理所有可能的错误组合)。
XA是用于处理分布式事务的标准。您可以通过Java Transaction API (JTA)处理Java中的XA事务。 Java EE服务器支持此内置功能。如果您不使用Java EE服务器,则可以使用单独的实现JTA的库,例如Narayana或Atomikos。
DAO中的每个方法都会打开与数据库的新连接,并在方法末尾将其关闭。
通常,这不是编写DAO的方式。打开数据库连接是一个相对较慢的操作。如果为在DAO中调用的每个方法打开一个新的数据库连接,则程序最像运行缓慢。您至少应该使用一个连接池,该池管理多个数据库连接,并允许您重用已经打开的连接。
如果我使用一个数据库实例,并且DAO中的每个方法都写入不同的表,我是否必须使用XA数据源?因为交易发生在服务层,但只发生在一个实例数据库中
如果您的DAO方法各自打开自己的连接,则它们将在单独的事务中运行。这是否是一个问题取决于您的应用程序需要做什么。 XA数据源不是使它们在一个事务中运行的解决方案。相反,您应该让他们都使用相同的连接和事务。
仅当您使用多个数据库系统或其他系统,并且希望能够执行跨这些系统的事务时,XA事务才真正有用。