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