JdbcMessageHandler 批量更新 - 不要在一个错误上取消所有内容

Posted

技术标签:

【中文标题】JdbcMessageHandler 批量更新 - 不要在一个错误上取消所有内容【英文标题】:JdbcMessageHandler batch update - not to cancel everything on one error 【发布时间】:2021-04-29 18:46:36 【问题描述】:

假设payload() 是具有 n 项的 ArrayList,其中一项具有 pk 重复值(表中已存在并导致重复违规)。

发生这种情况时,没有其他有效项目插入数据库。 批处理操作是否有可能会插入有效的(并且只会推送到 errorChannel 有问题的项目)?

@Bean
@ServiceActivator(inputChannel=..)
public MessageHandler jdbcMessageHandler() 
    JdbcMessageHandler jdbcMessageHandler = new JdbcMessageHandler(dataSource, "INSERT INTO...");
    jdbcMessageHandler.setPreparedStatementSetter((ps, message) ->...

  return...

【问题讨论】:

【参考方案1】:

不,在这样的假设下,您只是违反了批量插入的目的:全有或全无。

您可以考虑将split 预先列出并在该JdbcMessageHandler 中添加ExpressionEvaluatingRequestHandlerAdvice 以处理个别错误。

在文档中查看有关建议请求处理程序的更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#message-handler-advice-chain

【讨论】:

怀疑批处理是这样的。谢谢

以上是关于JdbcMessageHandler 批量更新 - 不要在一个错误上取消所有内容的主要内容,如果未能解决你的问题,请参考以下文章

为啥批量插入/更新更快?批量更新如何工作?

Thinkphp怎么批量更新数据

Thinkphp怎么批量更新数据

Thinkphp怎么批量更新数据

mybatis 怎么批量更新操作

mysql进阶 十四 批量更新与批量更新多条记录的不同值实现方法