В приложении 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
}
, а затем зафиксировать и закрыть соединение.
Заранее спасибо за ответы!