1

引发异常时,不会回滚添加到数据存储区的数据。这是正确的行为,因为它使用文件系统吗?或者它是否也应该回滚数据存储中的数据。我正在使用 Spring 3.2。我已将 Jackrabbit 部署到 JBoss 7.1.1。我正在使用 JtaTransactionManager,因为我也在使用数据库。编辑:

在阅读了 JTA 和 Spring 之后,我只在 Spring 配置文件中添加了这一行。似乎它注册了必要的东西。在我设置的“测试”中,我将一个文件存储在 Jackrabbit 中,然后我抛出一个运行时异常(之后我通常会持久保存到数据库,但由于异常中止它永远不会运行那么远,但这将是正常的案子)。所有这些都发生在服务层中的一个方法中,用@Transactional. 但是,在引发异常后,我仍然在数据存储中看到该文件,我尝试使用一个空的数据存储,并且我希望在引发异常后该文件会消失,但它仍然存在。这个对吗?只是回滚的元数据(我不知道存储在哪里)?

<tx:jta-transaction-manager/>
4

2 回答 2

1

何时将文件添加到数据存储区

二进制文件很早就存储在数据存储中,通常是在将二进制属性设置为节点之后(即使节点没有保存,更改仍然在所谓的“瞬态空间”中)。这意味着该文件甚至在事务提交之前就已添加到数据存储中。

数据存储中的文件将保留在那里,直到垃圾收集运行。这意味着,即使事务被回滚,文件也会被保留。

要摆脱未引用的文件,您需要运行数据存储垃圾收集

如何运行垃圾收集

正如Jackrabbit wiki 页面中有关数据存储的记录,“垃圾收集用于清除未使用的对象”。这是您需要添加到应用程序的管理任务。作为一般规则,建议在晚上或周末系统不忙时运行垃圾收集。

垃圾收集基本上会遍历存储库并标记所有仍在使用的文件,最后将删除那些未标记的文件(标记和清除)。

于 2013-09-11T09:39:20.017 回答
0

据我所知(如果我错了,请纠正我),将 Jackrabbit 与 JTA 一起使用的唯一方法是使用jencks通过 JCA 连接。你看过这个帖子吗?

于 2013-09-04T11:55:21.830 回答