我需要在数据源上执行5000个select语句并提取结果并将5000个值插入到不同数据源的表中。
5000个选择语句(都是不同的sqls)我一个接一个地说 (这需要更多时间)
对于5000个插入我正在做JdbcTemplate.batchUpdate()
上述工作需要每30分钟执行一次。我已经配置了弹簧批来完成这项工作,这将由CRON每30分钟触发一次。
一旦调用该方法完成5000个select语句它需要超过300个才能完成所以Websphere正在抛出超时异常。它说全球交易时间超过300秒。
我知道我可以在websphere中增加超时但我不能这样做,因为在生产中服务器配置文件是默认配置的。
有人可以建议我更好的方法来解决这个问题。
答案 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批处理项编写器导致超时。
现在已经解决了。希望这对面临类似问题的人有所帮助。