如何在Java EE环境中管理数据库和文件系统的事务?


问题内容

我将文件的属性(大小,更新时间…)存储在数据库中。因此,问题在于如何管理数据库和文件的事务。

在Java
EE环境中,JTA只能管理数据库事务。万一数据库更新成功但文件操作失败,是否应该为此编写文件回滚方法?此外,EJB容器中的文件操作违反了EJB规范。

你怎么看?


问题答案:

理想情况下,对外部资源(例如文件系统)的访问应通过 JCA连接器进行
。尽管围绕此讨论的文章很多,但我从未找到可用于事务性访问文件系统的现成的JCA连接器,因此我开始编写一个:

关于其他项目:

请注意,一旦您有多个交易参与者,该应用程序就会出现。服务器确实需要使用分布式事务,事情变得更加复杂。您一定不能低估这种复杂性(例如,数据库具有用于分布式事务的另一种超时机制)。

要考虑的另一种轻量级方法是使用在文件系统上写入的 SFSB
。如果实现SessionSynchronization接口,则会获取beforeCompletionafterCompletion回调。后者指示事务是已提交还是已回滚,并在必要时进行清理。然后,您可以实现事务行为。