【问题标题】:How to avoid transaction timeout (WTRN0006W) on Websphere 8.5.5 with pure JDBC如何使用纯 JDBC 在 Websphere 8.5.5 上避免事务超时 (WTRN0006W)
【发布时间】:2019-06-12 11:01:36
【问题描述】:

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

我们可以将输入数据拆分成更小的块并多次执行 CallableStatement 以实现更短的运行时间(30 秒左右)。处理整个数据块仍然需要超过 120 秒(如预期的那样)。但是事务超时仍然发生,尽管对于每个带有小块(循环中)的语句执行,我们都从 WAS 中配置的数据源获取连接,将 autocommit 设置为 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
}

然后提交并关闭连接。

提前感谢您的回答!

【问题讨论】:

    标签: jdbc transactions websphere-8


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2020-09-17
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多