Spring JdbcTemplate批量更新处理异常

2024-03-07

目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入。

我的问题是,如果其中一个更新出现任何异常,如何处理它(假设仅通过添加日志)并继续下一个更新 sql 语句?

另外 JdbcTemplate 的 batchUpdate() 方法如何处理异常?

片段在这里。

    /**
     * Saves the list of <code>Item</code> objects to the database in a batch mode
     * 
     * @param objects
     *    list of objects to save in a batch mode
     */
    public void save(final List<Item> listOfItems) {

        for (List<Debit> list : listOfItems) {
            getJdbcTemplate().batchUpdate(insertItem, new ItemBatchPreparedStatementSetter(list));
        }
    }

JdbcTemplate的batchUpdate()方法如何处理异常?

批量更新行为是JDBC 中未定义 http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29:

如果批量更新中的命令之一无法正确执行,则此方法将引发 BatchUpdateException,并且 JDBC 驱动程序可能会也可能不会继续处理该批处理中的其余命令。

您应该使用 DBMS 检查此行为。

Anyway, BatchUpdateException将被 spring 捕获并在一些清理后作为 RuntimeException 重新抛出(请参阅实现细节here https://github.com/SpringSource/spring-framework/blob/3.1.x/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L591).

所有这些逻辑都将与交易交织在一起 - 例如如果插入在事务范围内并且您重新抛出RuntimeException通过事务边界 - 事务(以及所有成功的插入)将被回滚。

因此,如果没有额外了解 DBMS 及其 JDBC 驱动程序在批量插入期间发生错误的行为,则无法有效实现所需的“仅记录错误行”批处理逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring JdbcTemplate批量更新处理异常 的相关文章

随机推荐

  • Angular AOT 组件中的相对路径

    我在这里问是因为我在网上找不到完整的文档 这个例子here https angular io docs ts latest cookbook aot compiler html太简单了 我有一个包含多个组件和一些模块的应用程序 用ngc编译
  • 在 IIS 5.1 (Windows XP) 上部署 ASP.NET MVC

    好吧 部署 ASP NET MVC 似乎很痛苦 我想在 Windows XP IIS 5 1 上部署 ASP NET MVC 应用程序 但似乎找不到如何执行此操作 当我在网络浏览器地址栏中输入应用程序名称时 我收到一条 网站不可用 消息 有
  • ES6数组初始化

    ES6 非常新 在 ES5 中我可能会做这样的事情 function newArray var data for var i 0 i lt 5 i data i test data i return data x newArray 在 ES
  • Tensorflow 中的反向传播(随时间)代码

    在哪里可以找到 Tensorflow python API 中的反向传播 通过时间 代码 或者使用其他算法 例如 当我创建 LSTM 网络时 TensorFlow 中的所有反向传播都是通过自动区分网络前向传递中的操作 并添加显式操作来计算网
  • 在 Android 版 PhoneGap 上捕获返回按键

    我正在使用 PhoneGap 进行 Android 应用程序开发 但我一直在捕获设备上的后退键按下 我尝试了其他线程和官方维基页面中的所有内容 但似乎都不起作用 我可以使用 keyEvent menuTrigger 和 keyEvent s
  • 如何以编程方式读取 PDF 书签

    我正在使用 PDF 转换器来访问 PDF 中的图形数据 一切工作正常 除了我没有得到书签列表 是否有可以读取 PDF 书签的命令行应用程序或 C 组件 我找到了 iText 和 SharpPDF 库 目前正在浏览它们 你曾经做过这样的事吗
  • 是否可以使用 stdout 作为 fluidd 源来捕获特定日志以写入elasticsearch?

    我对 fluidd 和 elasticsearch 都是菜鸟 我想知道 fluidd 是否可以从 stdout 捕获特定日志 在本例中为我们的应用程序生成的自定义审核日志 使用 stdout 作为源 并将它们写入到elasticsearch
  • 合并两个具有相同键的字典

    我有以下 2 本字典想要合并 我想合并相同的键 并且我想保留两个字典的值 我用了dict1 update dict2 但这替换了第二个到第一个字典中的值 u dict1 160 u na u na 162 u test u qq u wds
  • Kitkat (API 19) 中使用 setGroup() 的堆栈通知不起作用

    我有一个问题找不到答案 我已经尝试过 AndroidDeveloper 教程 我已经在 stackoverflow 和 google 上进行了搜索 但要么我的搜索技能太棒了 要么没有答案 我认为可以回答我的问题 当有多条消息时 我想将所有新
  • 当计时器触发作业时,如何在 Jenkins 中获取 BUILD_USER?

    我想在工作后电子邮件中向触发 Jenkins 工作的用户显示 这可以通过使用插件来实现构建用户变量插件和环境变量BUILD USER 但是当调度程序触发作业时 该变量不会被初始化 我们怎样才能做到这一点 我知道我们有一个名为 EnvInje
  • 如何使用opengl函数在c中制作用于绘制3D点的3D窗口?

    我可以制作 2D 窗口并绘制点 线等 我想制作 3D 窗口 以便可以通过绘制 3D 点 线来绘制 3D 对象 例如 glVertex3d x y z 如 2D glVertex2d x y 但我无法制作 3D 窗口 我只想制作一个 3D 窗
  • String.indexOf 函数出现意外结果?

    我真的对这个感到抓狂 情况是这样的 我有两个 JavaScript 字符串 如下所示 dsName Test 1 replacementString Test 我正在尝试查看 dsName 是否以 replacementString 开头
  • 防止在线棋牌游戏作弊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在许多在线国际象棋大厅中 我见过 引擎 的实例 其中作弊者会在主游戏窗口的同时打开国际象棋程序 然后他会进行设置 以便将对手的动作传送
  • 使用正则表达式的 jQuery 验证插件自定义方法

    我需要为 jQuery Validator 创建一个新方法 但不知道从哪里开始 我希望它检查输入的电子邮件是否包括 specifieddomain com 但这也是输入的最后一部分 例如 specificdomain comChris 就不
  • ISO 8601 格式的当前时间

    出于记录目的 R 脚本如何获取 UTC 时区中的当前日期和时间 作为以下格式的 ISO 8601 字符串 2015 12 31T14 26 56 600374 00 00 as POSIXlt似乎是解决方案 并且文档声称它接受格式参数 但我
  • 访问 SQL 创建一对多关系,无需强制引用完整性

    我有这个关系 我必须暂时销毁它才能使用 SQL 命令更改 salID 字段的大小 ALTER TABLE Adressen DROP CONSTRAINT ChildTableMainTable 如何使用 SQL 命令重新创建相同的关系类型
  • 如何快速验证区分大小写的文件名是否确实存在

    我必须制作一个与unix兼容的windows delphi例程 以确认文件系统中是否存在文件名与想要的完全相同的情况 例如 John txt 在那里 而不是 john txt 如果我检查 FileExists john txt 由于 win
  • 在连接之间共享事务

    我有一个 FileShare 爬虫 获取权限并将其放在某处以供以后审核 目前 它正在启动多个线程来抓取同一文件夹 以加快进程 在 C 中 每个SqlConnection对象有自己的SqlTransaction 由SqlConnection
  • Inno Setup - 检查目标中是否存在文件,否则不会中止安装

    我需要我的安装程序检查目标位置中是否存在文件 如果不存在 则安装将中止 我的项目是一个更新补丁 因此我希望安装程序在应用程序的主 exe 不在目标中时避免安装更新文件 我怎样才能做到这一点 有人可以给出一个通过 Windows 注册表检查文
  • Spring JdbcTemplate批量更新处理异常

    目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入 我的问题是 如果其中一个更新出现任何异常 如何处理它 假设仅通过添加日志 并继续下一个更新 sql 语句 另外 JdbcTemplate 的 batchU