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

我目前正在这样一个会议:

    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资源配置如何?

一些快速的Google搜索(带有关键字JTA Jackrabbit Spring JBoss)揭示了用Jackrabbit和XA JDBC DataSource设置XA事务可能说起来容易做起来难。旧的邮件列表条目报告说可以使用名为Jencks的JTA事务管理器来执行此操作,但是Jencks的开发似乎已被终止。

this JBoss community wiki page的1.2.3节中也可以看到(虽然有点费劲),其中指出“ jackrabbit在内部实现XA协议,并且在下面需要非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/

10-09 00:16