我目前使用 JCA rar 在 Glassfish 4 中部署了 Jackrabbit 2.6.4。
我正在使用 MySql 并在 Glassfish 中配置了一个数据源来访问数据库。在配置 RepositoryManager 时,我在 Jackrabbit repository.xml 中使用相同的数据源。
如果我通过 @Resource 注释将存储库注入到不会自动启动事务的容器托管 bean 中,一切都会按预期工作。
如果我通过 @Resource 注释将存储库注入到 EJB 中(这会导致容器管理事务),当我尝试使用存储库时会得到以下堆栈跟踪:
javax.resource.spi.LocalTransactionException:com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource) 的 com.sun.gjc.spi.LocalTransactionImpl.commit(LocalTransactionImpl.java:112) 的 autocommit=true 时无法调用提交.java:124) ... 原因:java.sql.SQLException:com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc 的 autocommit=true 时无法调用提交。 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.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java:126) 的 com.sun.enterprise.resource.ConnectorXAResource.handleResourceException(ConnectorXAResource.java:115) 的 autocommit=true 时不调用提交 ...] ]115) 在 com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java:126) ... ]]115) 在 com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java:126) ... ]]
查看 Jackrabbit 文档是状态:
如果您使用数据库持久性管理器,则配置的数据库连接必须不受外部事务管理器的控制。Jackrabbit 在更高级别实现分布式 XA 事务支持,并期望完全控制底层数据库连接。
鉴于此,我如何/可以配置 Jackrabbit 和 Glassfish 以允许容器管理的事务和 Jackrabbit 管理的事务一起参与同一个全局事务?
我尝试将 Jackrabbit JCA 适配器和数据源连接池都设置为使用 XA 事务。我还将 Jackrabbit JCA 属性 bindSessionToTransaction 设置为 true。这些都不起作用。