我正在将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/