如何使用纯 JDBC 在 Websphere 8.5.5 上避免事务超时 (WTRN0006W)

How to avoid transaction timeout (WTRN0006W) on Websphere 8.5.5 with pure JDBC

在 Websphere 应用程序服务器 8.5.5 上的 EAR 应用程序 运行ning 中,我们必须执行 CallableStatement(调用 Oracle DB 中的存储过程)运行超过五分钟或更长时间,具体取决于输入数据。由于在 Websphere AS 中默认设置为 120 秒的事务超时(代码 WTRN0006W),该操作会自动回滚。由于客户要求,我们无法更改此值。

我们可以将输入数据拆分成更小的块,并多次执行 CallableStatement 以实现更短的 运行 时间(30 秒左右)。处理整个数据块仍然需要超过 120 秒(如预期)。但是事务超时仍然发生,尽管对于每个小块语句执行(在循环中)我们从 WAS 中配置的数据源获取连接,将自动提交设置为 false,在语句执行执行提交和关闭连接之后。然后在下一个循环周期中再次使用下一个块。

语句执行的整个过程是在无状态 EJB 中完成的,该 EJB 从调度到 运行 的单例 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
}

然后提交并关闭连接。

提前感谢您的回答!

尝试将无状态会话 bean 方法标记为事务 NOT_SUPPORTED 或从不,这将导致它 运行 在全局事务之外。 (请注意,您无论如何都需要执行此操作才能使 connection.commit() 调用有效 - 由于超时,它可能不会走那么远)。

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