gpt4 book ai didi

java - 当 Jackrabbit 是全局交易的一部分时,我该如何使用它?

转载 作者:行者123 更新时间:2023-12-02 09:05:46 25 4
gpt4 key购买 nike

我正在将 Jackrabbit 与数据存储一起使用,并为其余数据使用单独的数据库。我已将 Jackrabbit JCA 部署到 JBoss 7.1.1。我已经调试了该应用程序,并且看到 session 实例的类型为 XASessionImpl。

我目前正在进行这样的 session :

    final Credentials credentials = new SimpleCredentials("admin", "admin".toCharArray());

try {
final Session session = repository.login(credentials);
return session;
} catch (RepositoryException e) {
throw new RuntimeException(e);
}

每次访问完成后,我都会调用 session.save();,然后调用 session.logout()。当它是全局事务的一部分时,这是正确的吗?我对分布式事务等了解不多,如果我错了,请纠正我。我尝试在用 @Transactional 注释的方法之一(使用 Spring 3.2)中引发运行时异常,但数据存储区中的数据并未被删除。它是否正确?如果事务回滚,数据存储中添加的数据是否会被删除?我的“测试”环境是:将内容添加到 Jackrabbit,然后添加到数据库,然后抛出运行时异常。或者 Jackrabbit 配置不正确?

最佳答案

Jackrabbit 可能正在运行自己的事务,假设 Spring 管理的事务已回滚,但数据存储中的内容仍然存在。您的 Spring/JBoss 资源配置如何?

一些快速谷歌搜索(使用关键字 JTA Jackrabbit Spring JBoss)显示,使用 Jackrabbit 和 XA JDBC 数据源设置 XA 事务可能说起来容易做起来难。旧的邮件列表条目报告能够使用名为 Jencks 的 JTA 事务管理器来执行此操作,但 Jencks 的开发似乎已停止。

还可以看看(尽管持保留态度)this JBoss community wiki page 中的 1.2.3 节。其中指出“jackrabbit 在内部实现 XA 协议(protocol),并且需要底层的非 XA 数据源”,这意味着您所看到的行为。

此外,作为 XA 的一个选项,您是否考虑过像这样模拟 XA(注意伪代码)?:

@Transactional
public void addContent() {
try {
storeContentInJcrRepo();
saveMetadataInDatabase();
catch (DataAccessException e) {
deleteNewlyStoredContentFromJcrRepo();
// Rethrow to ensure DB transaction is rolled back
throw e;
}
}

关于java - 当 Jackrabbit 是全局交易的一部分时,我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com