You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从JBoss 4.x迁移至Glassfish 2022及Java升8遇非XA资源异常

解决Glassfish混合XA与非XA数据源的事务异常

问题根源

Glassfish事务管理器默认禁止同一场本地事务中同时存在XA资源和多个非XA资源,而JBoss的事务逻辑允许这种混合场景,这就是你在Glassfish中触发Local transaction already has 1 non-XA Resource: cannot add more resources异常的原因。

Glassfish配置调整方案

1. 修改事务服务核心参数

通过Glassfish管理控制台调整事务服务配置:

  • 路径:配置 > 服务器配置 > 事务服务
  • 启用允许非组件调用者(对应参数allow-non-component-callers)
  • 启用非事务性读取(对应参数non-transactional-reads)
  • 保存后重启Glassfish,该配置会放宽事务对非XA资源的限制

2. 用XA包装类适配非XA数据源

如果无法替换非XA驱动,可借助Glassfish的XA包装能力:

  • 添加数据源时,选择javax.sql.XADataSource作为数据源类型
  • 配置时指定实际的非XA驱动类,Glassfish会自动为其生成XA兼容的包装层,让非XA资源可以参与XA事务

3. 代码层面拆分事务

若配置调整无效,可从代码逻辑入手:

  • 将涉及XA和非XA数据源的操作拆分为独立事务,避免在同一场事务中同时调用两类资源
  • 对非XA数据源的操作设置为非事务模式(通过Connection.setAutoCommit(true),不纳入事务管理)

触发的异常信息

Exception creating object: 
java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.  
    at com.sun.gjc.spi.base.AbstractDataSource.getConnection(AbstractDataSource.java:119)
    at com.crlcorp.docqc.app.jdbc.DocQCDataConn.<init>(DocQCDataConn.java:27)
    at com.crlcorp.docqc.app.jdbc.DataLoader.getUnreviewedItems(DataLoader.java:111)
    at com.crlcorp.docqc.app.ejb.DocQCBean.getUnreviewedItems(DocQCBean.java:27)

内容的提问来源于stack exchange,提问作者JustinKSU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:52:09