我目前已经使用JCA rar在Glassfish 4中部署了Jackrabbit 2.6.4。容器管理器事务和JackRabbit
我使用MySql并在Glassfish中配置了一个数据源来访问数据库。配置RepositoryManager时,我在Jackrabbit repository.xml中使用相同的数据源。
如果我通过@Resource注释将资源库注入到不会自动启动事务的容器管理bean中,那么所有操作都按预期工作。
如果我通过注入@Resource注解一个仓库到EJB(这会导致容器管理的事务)我得到以下堆栈跟踪当我尝试使用的存储库:
javax.resource。 spi.LocalTransactionException:在autocommit = true时无法调用commit commit at com.sun.gjc.spi.LocalTransactionImpl.commit(LocalTransactionImpl.java:112) at com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java :124) ... 原因:java.sql.SQLException:autocommit = true时无法调用commit在com.mysql.jdbc.SQL上的 Error.createSQLException(SQLError.java:927) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) 在com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1724) 在COM。 sun.gjc.spi.LocalTransactionImpl.commit(LocalTransactionImpl.java:106) ... 72更多 ]] [2013-10-28T14:49:29.646-0700] [glassfish 4.0] [警告] [jts.unexpected_error_occurred_twopc_commit ] [javax.enterprise.system.core.transaction.com.sun.jts.jtsxa] [tid:_ThreadID = 33 _ThreadName = http-listener-1(3)] [timeMillis:1382996969646] [levelValue:900] [[ JTS5067:提交中发生意外错误 javax.transaction.xa.XAException:javax.resource.spi.LocalTransactionException:在com.sun中,当autocommit = true时,无法调用提交 。 enterprise.resource.ConnectorXAResource.handleResourceException(ConnectorXAResource.java:115) 在com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java:126) ... ]
综观Jackrabbit文档指出:
如果您使用数据库持久性管理器,则配置的数据库连接不得受外部事务管理器的控制。 Jackrabbit在更高层次上实现分布式XA事务支持,并期望完全控制底层数据库连接。
鉴于此,如何配置Jackrabbit和Glassfish以允许容器管理事务和Jackrabbit管理事务共同参与同一全局事务?
我曾尝试设置Jackrabbit JCA适配器和数据源连接池以使用XA事务。我还将Jackrabbit JCA属性bindSessionToTransaction设置为true。这些都没有奏效。