从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
相关产品推荐
相关产品推荐

