当前位置: 首页 > 知识库问答 >
问题:

Spring xd批处理作业锁定

怀经赋
2023-03-14

我正在使用sping-xd通过批处理作业进行数据摄取。大量作业在4个容器中并行运行。任何地方都在10到40个作业之间。其中大多数在不到一分钟的时间内完成。我使用redis(而不是Rabbitmq)和mysql进行数据存储。Spring-xd-批处理使用不同的mysql-db进行作业/步骤统计,我的应用程序使用不同的mysql-db用于自己的目的。两个mysql-db都在同一台服务器上。所有4个容器和管理员都指向同一个mysql-db。

我注意到的是,大多数时候,一切都很好,但偶尔(至少每天一次),我确实会遇到以下例外:

原因:org。springframework。刀。DataAccessResourceFailureException:无法获取最后一个_insert_id();嵌套的例外是java。sql。SQLException:超过了锁等待超时;尝试重新启动事务。

这是spring xd(不是我的应用程序)抛出的。异常并不特定于特定容器(它随机发生在任何容器上),也不特定于特定作业。

我花了很多时间在谷歌上除草。我已将innodb_lock_wait_timeout从50更新为600。我已经将我的trx_隔离更新为从repeatable read读取committed,但这些似乎都没有任何区别。此外,我还启用了慢速查询日志记录,但所有记录的查询都与引发异常的时间段不匹配。

任何指点都将不胜感激。

共有1个答案

贺景山
2023-03-14

我的解决方法是将*seq表从innodb更改为mysam引擎。已经这样运行了一个多月了,没有桌子被锁住。

 类似资料:
  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我在两个不同的XMLS中定义了两个作业。比如工作A和工作B,我需要在成功完成工作A时打电话给工作B,做这件事最好的方法是什么。我对spring-batch相当陌生,因此正在寻找处理此问题的最佳方法。

  • 我有一个MyObject流,我想将它批量持久化到DB中(不是一个接一个,而是一次1000个)。所以我想做一个转变,就像 其中每个列表都有一些固定大小的批处理大小。有没有办法用标准的Java 8 Stream API做到这一点?

  • 我已经开始探索Spring Batch,并遇到了一些基本问题。