我们可以在同一个存储库类中使用xa和非xa资源的组合。 如果可以,任何人都可以解释它将如何表现以及交易将如何运作。目前我们在我们的存储库中使用2 xa资源和2个非xa资源。我们正在使用glassfish和eclipselink。 方法有什么问题。
答案 0 :(得分:1)
您不能在单个事务中使用多个本地(=非XA)数据源,但可以在全局事务中组合多个XA资源,或者让非XA资源参与全局事务(使用1个XA数据源)(见LLR 1 / 2)。
你可以考虑的事情:
禁用对一个非XA数据源的事务支持,或将它们包装在具有@TransactionAttribute(NOT_SUPPORTED)
的EJB中以禁用事务。您也可以手动编排交易,但这可能会变得非常麻烦。
来自GlassFish 3 documentation :(旧版本,但同样适用于较新版本)
交易范围本地交易仅涉及一个非XA 资源并要求所有参与的应用程序组件 在一个过程中执行。本地事务优化是特定的 到资源管理器,对Java EE应用程序是透明的。
在GlassFish Server中,如果JDBC资源满足,则该资源是非XA的 以下标准:
在JDBC连接池配置中,DataSource类可以 没有实现javax.sql.XADataSource接口。
资源类型设置未设置为javax.sql.XADataSource。
如果满足以下条件,则交易仍然是本地的:
使用了一个且仅有一个非XA资源。如果有任何额外的非XA 使用资源,中止交易。
不会发生任何事务导入或导出。
涉及多个资源或多个参与者的交易 流程是分布式或全局事务。全球交易 如果启用了最后一个代理优化,则可能涉及一个非XA资源。 否则,所有resourced必须是XA。 use-last-agent-optimization property默认设置为true。有关如何设置此的详细信息 属性,请参阅配置事务服务。
如果在事务中仅使用一个XA资源,则为一阶段提交 发生,否则交易与两阶段协调 提交协议。