我正在尝试理解Java数据资源的使用。但我还是不知道什么时候该用,什么时候不用。
我读过我们使用两个数据库时使用的XA数据资源。但我不知道两个数据库是什么意思。
例如:
我有两层类(服务和DAO)
服务层中的一个被注释为事务的方法,在DAO中调用两个方法。
DAO中的每个方法都打开到数据库的新连接,并在方法的末尾关闭它。
如果我使用一个数据库实例,并且DAO中的每个方法都写入不同的表,那么是否必须使用XA数据资源?因为事务发生在服务层,但只发生在一个实例数据库中。
发布于 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事务才真正有用。
https://stackoverflow.com/questions/54365485
复制相似问题