Как избежать тайм-аута транзакции (WTRN0006W) в Websphere 8.5.5 с чистым JDBC - PullRequest
0 голосов
/ 18 января 2019

В приложении EAR, работающем на сервере приложений Websphere 8.5.5, мы должны выполнить CallableStatement (вызов хранимой процедуры в БД Oracle), который выполняется более пяти минут или более в зависимости от входных данных. Операция автоматически откатывается из-за тайм-аута транзакции (код WTRN0006W), который по умолчанию установлен в 120 секунд в Websphere AS. Мы не можем изменить это значение из-за требований клиентов.

Мы можем разделить входные данные на более мелкие порции и выполнить CallableStatement несколько раз, чтобы добиться более короткого времени выполнения (30 секунд или около того). Обработка целых блоков данных по-прежнему занимает более 120 секунд (как и ожидалось). Но тайм-аут транзакции все еще происходит, хотя для каждого выполнения оператора с небольшим фрагментом (в цикле) мы получаем соединение из источника данных, настроенного в WAS, устанавливаем для autocommit значение false, после выполнения оператора выполняет фиксацию и закрывает соединение. Затем снова со следующим фрагментом в следующем цикле цикла.

Весь процесс выполнения операторов выполняется в EJB без сохранения состояния, который вызывается из Singleton EJB, запуск которого запланирован два раза в день. Мы не используем JTA и JPA, просто JDBC.

Можно ли избежать тайм-аута транзакции, если мы выполним оператор несколько раз?

Как мы получаем источник данных при запуске приложения:

javax.naming.Context ctx = new InitialContext();
javax.sql.Datasource ds = (javax.sql.Datasource) ctx.lookup("jndi/datasource1");

Как мы получаем соединение:

java.sql.Connection conn = m24sb.getConnection();
conn.setAutoCommit(false)

Как мы выполняем оператор:

try (CallableStatement sta = conn.prepareCall("{ call SOME_STORED_PROC }"))) { 
// ... setting statement params
sta.execute();
// ... resolving returned values
}

, а затем зафиксировать и закрыть соединение.

Заранее спасибо за ответы!

1 Ответ

0 голосов
/ 18 января 2019

Попробуйте пометить метод сессионного компонента без сохранения состояния как транзакцию NOT_SUPPORTED или NEVER, что приведет к его запуску вне глобальной транзакции. (Обратите внимание, что вам все равно придется это сделать, чтобы ваш вызов connection.commit () был действительным - скорее всего, он просто не зашел слишком далеко из-за тайм-аута).

@javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
public void yourStatelessEJBMethod() {
    ... code that invokes stored procedure and commits transaction
}
...