如何在Java EE环境中管理数据库和文件系统的事务?
问题内容:
我将文件的属性(大小,更新时间…)存储在数据库中。因此,问题在于如何管理数据库和文件的事务。
在Java
EE环境中,JTA只能管理数据库事务。万一数据库更新成功但文件操作失败,是否应该为此编写文件回滚方法?此外,EJB容器中的文件操作违反了EJB规范。
你怎么看?
问题答案:
理想情况下,对外部资源(例如文件系统)的访问应通过 JCA连接器进行
。尽管围绕此讨论的文章很多,但我从未找到可用于事务性访问文件系统的现成的JCA连接器,因此我开始编写一个:
- 看一下:JCA连接器:文件系统适配器。这是相当基本的,但是可以管理文件的提交/回滚。
关于其他项目:
- 我不知道commons-transactions的确切状态,对我来说似乎已经死了。
- 看一下JBoss事务性文件I / O,看起来很有希望。
- 也来看看Filera:文件资源适配器,但我认为它不是事务性的
请注意,一旦您有多个交易参与者,该应用程序就会出现。服务器确实需要使用分布式事务,事情变得更加复杂。您一定不能低估这种复杂性(例如,数据库具有用于分布式事务的另一种超时机制)。
要考虑的另一种轻量级方法是使用在文件系统上写入的 SFSB
。如果实现SessionSynchronization
接口,则会获取beforeCompletion
和afterCompletion
回调。后者指示事务是已提交还是已回滚,并在必要时进行清理。然后,您可以实现事务行为。