2013-10-28 51 views
0

我目前已經使用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。這些都沒有奏效。

回答

0

一些試驗和錯誤我想出了以下辦法後:

  1. 創建GlassFish的JDBC連接池,用於訪問兔崽子庫表。
  2. 將資源類型設置爲javax.sql.DataSource並啓用'Non Transactional Connections'
  3. 創建一個可用於訪問Jackrabbit JDBC連接池的JDBC資源。使用在兔崽子的repository.xml在此資源定義的JNDI名稱來配置持久性管理等
  4. 使用兔崽子,JCA資源適配器
  5. 設置事務支持XATransaction
  6. 添加的屬性創建連接器連接池「bindSessionToTransaction」,並將其設置爲true
  7. 創建可用於存儲庫注入到一個EJB

我有一個無狀態EJB測試這和它的作品沒有錯誤連接器資源。

我還創建了第二個類型爲javax.sql.DataSource的JDBC連接池和一個指向獨立數據庫的JDBC資源,該數據庫維護應用程序其他表並創建使用數據源的persistence.xml。

然後,我修改了應用程序數據庫(使用JPA)中的repo和表,並確認如果回滾事務,回滾和應用程序表上的更改都會正確回滾。

我相信這是正確的方法,因爲它允許Jackrabbit完全控制它的數據庫連接,但仍然作爲XA資源參與容器管理事務。

我測試了第二個數據源都是XADataSource和非XA數據源,並且兩種方法都有效。我認爲它不需要成爲XADataSource,因爲事務中沒有其他非XA DataSources,並且它通過LLR(記錄上次資源)參與全局事務。

更新1:

原來你也可以得到這個繞過回購數據源,並直接在庫中的XML配置JDBC URL的工作。這樣做的一個好處是,在對不需要在每個Glassfish實例中創建數據源的repo進行羣集時,您可以複製repository.xml並更改羣集節點ID。