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

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

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

你怎么看?

理想情况下,访问外部资源(如文件系统)应通过JCA连接器 。 虽然有几个post围绕讨论这个,我从来没有找到一个现成的JCA连接器用于事务访问文件系统,所以我开始写一个:

  • 看看: JCA连接器:文件系统适配器 。 这是相当基本的,但管理文件的提交/回滚。

关于其他项目:

  • 我不知道公共交易的确切状态,对我来说似乎已经死了。
  • 看看JBoss Transactional File I / O ,看起来很有前途。
  • 还要看一下Filera:文件资源适配器 ,但我不认为它是事务性的

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

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

JTA不仅仅适用于数据库,如果该资源支持XA事务,它可以与任何其他资源一起使用。 例如, XADisk可以实现文件系统与XA事务的这种集成。 因此,它还可以解决您一直试图解决的文件系统和数据库一致性问题。

希望有所帮助。

尼廷

手动。 您可能需要为此编写补偿交易。

也许看一下commons-transaction进行事务性文件访问。 参考:

  • Java中的事务文件系统
  • 一个XA文件系统
  • 一个XA文件系统,更新

在任何情况下,您都必须在EJB容器外部编写文件,或者与@ewernli指出的JCA连接器进行交互。