【发布时间】:2019-05-24 15:00:01
【问题描述】:
我正在编写一个 Web 服务方法,该方法写入第一个模式“IMMO”,然后写入另一个模式“CSF”。 写入第一个模式运行良好,但第一次尝试写入第二个模式导致以下错误:
ORA-25351:正在使用事务
我需要的是一个独特的分布式事务,该事务从我的 Web 服务方法的开头开始,到此方法的返回结束。 我的 Web 服务由无状态 EJB 实现,它调用其他无状态 EJB,所有这些 EJB 都使用默认事务参数:
- 未指定事务管理,因此假定为 CMT
- 未指定事务属性,因此假定为 REQUIRED
尽管如此,当我尝试连接到第二个数据源时,它似乎认为我在另一个会话中。
服务器是tomee 7.0.3
我想我在 tomee 配置中遗漏了一些东西,但我找不到任何东西......
这是来自 tomee.xml 的数据源定义:
<Resource id="ImmoDataSource" type="javax.sql.DataSource">
DataSourceCreator dbcp
name ImmoDataSource
username IMMO
password ****
JdbcUrl jdbc:oracle:thin:@srv-ora5:1521:IBOP
JdbcDriver oracle.jdbc.xa.client.OracleXADataSource
validationQuery select * from dual
connectionProperties useUnicode=false;characterEncoding=WE8MSWIN1252;
maxTotal 30
maxIdle 1
minIdle 0
maxWaitMillis 60000
DefaultAutoCommit false
testOnBorrow false
</Resource>
<Resource id="CSFDataSource" type="javax.sql.DataSource">
DataSourceCreator dbcp
name CSFDataSource
username CSF
password ***
JdbcUrl jdbc:oracle:thin:@srv-ora5:1521:IBOP
JdbcDriver oracle.jdbc.xa.client.OracleXADataSource
validationQuery select * from dual
connectionProperties useUnicode=false;characterEncoding=WE8MSWIN1252;
maxTotal 30
maxIdle 1
minIdle 0
maxWaitMillis 60000
DefaultAutoCommit false
testOnBorrow false
</Resource>
我希望第二个模式 CSFDataSource 中的写入与写入第一个模式的事务在同一事务中执行。
我写了一个小的 web 服务,只有一个小类,它使用相同的 tomee.xml,并且重现了这个问题:
package fr.csf.testxa;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.sql.DataSource;
@Stateless
@WebService
public class TestXa
{
@Resource
private DataSource CSFDataSource;
@Resource
private DataSource ImmoDataSource;
@WebMethod
public String test() throws SQLException
{
String ret = "?";
// This first insert via ImmoDataSource goes well
Connection cnx = this.ImmoDataSource.getConnection();
Statement stm = cnx.createStatement();
stm.executeUpdate( "insert into testxa( id) values ( sys_guid())");
// The second access gets the ORA-25351 error
cnx = this.CSFDataSource.getConnection();
stm = cnx.createStatement();
stm.executeUpdate( "insert into testxa( id) values ( sys_guid())");
// We never arrive here because of the SQLException
ret = "OK";
return ret;
}
}
经过一番搜索和多次尝试,我发现只有当两个数据源引用同一个数据库时才会出现 ORA-25351 错误。但我不认为引用同一数据库的不同模式是非法的。该代码是很久以前为 Weblogic 8.1 服务器编写的,并且运行良好。
【问题讨论】:
标签: oracle jakarta-ee xa tomee-7