Я получаю сообщение об ошибке «ORA-25351: транзакция используется» при доступе к базе данных Oracle из приложения Java, запущенного на сервере Tomee - PullRequest
0 голосов
/ 24 мая 2019

Я пишу метод веб-службы, который записывает в первую схему «IMMO», а затем записывает в другую схему «CSF».Запись в первую схему выполняется нормально, но первая попытка записи во вторую схему приводит к следующей ошибке:

ORA-25351: транзакция используется

Что мне нужно, так этоуникальная распределенная транзакция, начиная с начала моего метода веб-службы и заканчивая возвращением этого метода.Мой веб-сервис реализован EJB без сохранения состояния, который вызывает другие EJB без сохранения состояния, все эти EJB используют параметры транзакции по умолчанию:

  • управление транзакциями не указано, поэтому предполагается, что CMT
  • атрибут транзакции не указан, поэтому предполагается, что НЕОБХОДИМО

Несмотря на все это, кажется, что когда я пытаюсь установить соединение со вторым источником данных, он считает, что яЯ в другой сессии.

Сервер - это 7.0.3

Я думаю, что что-то пропустил в конфигурации, но я ничего не могу найти ...

Вот определение источника данныхИсходя из 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 выполняется в той же транзакции, что и запись в первую.

Я написалмаленький веб-сервис, только один маленький класс, который использует тот же 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, и он отлично работал.

1 Ответ

0 голосов
/ 11 июня 2019

После большой работы я нашел объяснение: Версия моего драйвера JDBC Oracle (ojdbc7.jar) может быть несовместима с версией базы данных Oracle (Oracle 10gR2).

Вот ссылка на сайт Oracle: https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/JDBC-getting-started.html#GUID-926E5324-D89A-4A00-B1AE-975C1089F0EA

, где можно прочитать это:

Oracle Database 12c Release 2 (12.2.0.1) Драйверы JDBC сертифицированы для поддерживаемых выпусков Oracle Database (11.x.0.x). Однако они не сертифицированы для работы со старыми неподдерживаемыми выпусками баз данных, такими как 10.2.x, 10.1.x, 9.2.x и 9.0.1.x.

Поэтому я заменил мой драйвер ojdbc7.jar на старый ojdbc1.4.jar. Но теперь я получить другую ошибку:

Невозможно подключить соединение в транзакции: enlistResource возвращает false.

Но я думаю, что это другая проблема, и я создам для нее другой вопрос.

...