【问题标题】:I get the error "ORA-25351: transaction in use" when I access the Oracle database from a Java application running on a Tomee server当我从运行在 Tomee 服务器上的 Java 应用程序访问 Oracle 数据库时,我收到错误“ORA-25351:正在使用的事务”
【发布时间】: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


    【解决方案1】:

    经过大量工作,我找到了一个解释: 我的 Oracle JDBC 驱动程序 (ojdbc7.jar) 的版本可能与 Oracle 数据库的版本 (Oracle 10gR2) 不兼容。

    这里是甲骨文网站的链接: https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/JDBC-getting-started.html#GUID-926E5324-D89A-4A00-B1AE-975C1089F0EA

    哪里可以读到:

    Oracle 数据库 12c 第 2 版 (12.2.0.1) JDBC 驱动程序已通过受支持的 Oracle 数据库版本 (11.x.0.x) 的认证。但是,它们未经认证可与旧的、不受支持的数据库版本一起使用,例如 10.2.x、10.1.x、9.2.x 和 9.0.1.x。

    所以我用旧的 ojdbc1.4.jar 驱动程序替换了我的 ojdbc7.jar 驱动程序。但现在我 得到另一个错误:

    无法在事务中登记连接:enlistResource 返回“false”。

    但我认为这是另一个问题,我将为此创建另一个问题。

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多