在300s Websphere,Spring批处理,DB2之后的事务超时时间

时间:2016-11-10 07:14:17

标签: transactions db2 websphere

我需要在数据源上执行5000个select语句并提取结果并将5000个值插入到不同数据源的表中。

5000个选择语句(都是不同的sqls)我一个接一个地说 (这需要更多时间)

对于5000个插入我正在做JdbcTemplate.batchUpdate()

上述工作需要每30分钟执行一次。我已经配置了弹簧批来完成这项工作,这将由CRON每30分钟触发一次。

一旦调用该方法完成5000个select语句它需要超过300个才能完成所以Websphere正在抛出超时异常。它说全球交易时间超过300秒。

我知道我可以在websphere中增加超时但我不能这样做,因为在生产中服务器配置文件是默认配置的。

有人可以建议我更好的方法来解决这个问题。

3 个答案:

答案 0 :(得分:0)

您可以使用

增加当前线程的事务超时
transaction.setTransactionTimeout(int seconds)
在致电

之前,在UserTransaction

transaction.begin()

http://docs.oracle.com/javaee/6/api/javax/transaction/UserTransaction.html

答案 1 :(得分:0)

您可以尝试减少SELECT的数量,因为每个请求和响应都是网络延迟的单独项目,无论它们在数据库端占用多少时间。即使查询很简单,发出5000个单独的查询并等待他们的个人结果也需要时间SELECT 1 FROM SYSIBM.SYSDUMMY1 s

如果两个或多个查询具有相同类型的结果,那么您可以将它们与UNION一起加入,如果预计两个或多个查询具有相同数量的结果,那么您可以通过它们加入它们结果列或使用ROW_NUMBER()生成的结果键:

select a,b,c from .... and select a,e,f from...变成

select table1.a, b,c,d,e,f from
table (select a,b,c from ...) table1,
table (select a,e,f from ...) table2
where
 table1.a = table2.a

希望这有帮助,

答案 2 :(得分:0)

谢谢你和Turan yuksel的建议。我已经解决了这个问题。

我已将5000平方英尺拆分为较小的单位并作为请求列表处理,而不是5000平方英尺的请求。现在弹簧批没有超时问题。由于批处理事务在300秒后超时,因此Spring批处理项编写器导致超时。

现在已经解决了。希望这对面临类似问题的人有所帮助。