【发布时间】: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