【发布时间】:2010-03-11 04:48:49
【问题描述】:
我将文件的属性(大小、更新时间……)存储在数据库中。所以问题是如何管理数据库和文件的事务。
在Java EE 环境中,JTA 只能管理数据库事务。 如果更新数据库成功但文件操作失败,我应该为此编写文件回滚方法吗?而且,EJB容器中的文件操作违反了EJB规范。
你有什么意见?
【问题讨论】:
标签: java file jakarta-ee transactions jta
我将文件的属性(大小、更新时间……)存储在数据库中。所以问题是如何管理数据库和文件的事务。
在Java EE 环境中,JTA 只能管理数据库事务。 如果更新数据库成功但文件操作失败,我应该为此编写文件回滚方法吗?而且,EJB容器中的文件操作违反了EJB规范。
你有什么意见?
【问题讨论】:
标签: java file jakarta-ee transactions jta
对文件系统等外部资源的访问最好通过JCA 连接器。虽然有几篇文章讨论这个问题,但我从来没有找到一个现成的 JCA 连接器用于对文件系统进行事务访问,所以我开始写一个:
关于其他项目:
请注意,只要您有多个交易参与者,应用程序就会出现。服务器确实需要使用分布式事务,事情变得更加复杂。你不能低估这种复杂性(例如数据库有另一种分布式事务的超时机制)。
要考虑的另一种轻量级方法是使用在文件系统上写入的 SFSB。如果你实现SessionSynchronization 接口,你会得到beforeCompletion 和afterCompletion 回调。后者指示事务是已提交还是已回滚,如有必要,您可以进行清理。然后,您可以实现事务行为。
【讨论】:
JTA 不仅仅适用于数据库,如果该资源支持 XA 事务,它还可以与任何其他资源一起长期使用。例如,XADisk 启用文件系统与 XA 事务的此类集成。因此,它还可以解决您一直试图解决的文件系统和数据库一致性问题。
希望对您有所帮助。
尼丁
【讨论】:
手动。您可能需要为此编写补偿事务。
【讨论】:
也许可以查看commons-transaction 以获取事务文件访问权限。参考:
在任何情况下,您都必须在 EJB 容器之外编写文件或与 @ewernli 指出的 JCA 连接器交互。
【讨论】: