如何在Java EE环境中管理数据库和文件系统的事务?
2022-09-04 21:48:18
我将文件的属性(大小,更新时间等)存储在数据库中。所以问题是如何管理数据库和文件的事务。
在Java EE环境中,JTA只能管理数据库事务。如果更新数据库成功但文件操作失败,我是否应该为此编写文件回滚方法?此外,EJB 容器中的文件操作违反了 EJB 规范。
你怎么看?
我将文件的属性(大小,更新时间等)存储在数据库中。所以问题是如何管理数据库和文件的事务。
在Java EE环境中,JTA只能管理数据库事务。如果更新数据库成功但文件操作失败,我是否应该为此编写文件回滚方法?此外,EJB 容器中的文件操作违反了 EJB 规范。
你怎么看?
理想情况下,对外部资源(如文件系统)的访问应通过 JCA 连接器进行。虽然有几篇文章讨论了这个问题,但我从未找到一个现成的JCA连接器来对文件系统进行事务访问,所以我开始写一个:
关于其他项目:
请注意,只要您有多个事务参与者,应用程序服务器就确实需要使用分布式事务,事情就会变得更加复杂。你不能低估这种复杂性(例如,数据库有另一种分布式事务的超时机制)。
另一种需要考虑的轻量级方法是使用在文件系统上写入的 SFSB。如果实现 SessionSynchronization
接口,则会得到和回调。后者指示事务是否已提交或回滚,如有必要,请执行清理。然后,您可以实现事务行为。beforeCompletion
afterCompletion
JTA 不仅适用于数据库,如果任何其他资源支持 XA 事务,它可以长期与该资源一起使用。例如,XADisk 支持文件系统与 XA 事务的这种集成。因此,它还可以解决您一直试图解决的文件系统和数据库一致性问题。
希望有所帮助。
尼丁