跳至主要內容

Batch批处理

xuejmnet大约 3 分钟

Batch批处理

easy-query如果需要使用batch功能首先需要在链接字符串添加rewriteBatchedStatements=true启用参数(mysql),默认框架会在配置参数阈值到达后自动合并sql调用executeBatch合并,如果需要手动调用或者手动限制不调用可以通过调用batch方法

文档提供的链接字符串设置不一定适合所有版本请以实际情况为准可以通过本地库进行10w级别的插入来进行测试判断是否生效

mysql需要链接字符串启用批处理参数rewriteBatchedStatements=true,其他数据库自行查询相关的说明也可能不需要 addBatchexecuteBatch

sqlserveruseBulkCopyForBatchInsert=true; 添加到连接字符串可启用此功能。 批处理相关链接 https://learn.microsoft.com/zh-cn/sql/connect/jdbc/use-bulk-copy-api-batch-insert-operation?view=sql-server-ver16open in new window

例如

jdbc:mysql://127.0.0.1:3306/easy-query-test?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true

配置名称默认值描述
insertBatchThreshold1024如果insertable一次性添加对象集合大于等于1024个那么会对其进行相同sql进行合并提高执行效率,链接字符串需要添加rewriteBatchedStatements=true(mysql),可以通过调用insert或者update的batch方法来手动使用或者禁用
updateBatchThreshold1024如果updatable一次性添加对象集合大于等于1024个那么会对其进行相同sql进行合并提高执行效率,链接字符串需要添加rewriteBatchedStatements=true(mysql),可以通过调用insert或者update的batch方法来手动使用或者禁用

代码注意点

说明!!!

使用batch可以有效的提高插入或者更新的性能,但是会导致返回结果不正确,如果使用batch那么自行处理返回结果

easyQuery.insertable(r).batch().executeRows();


==> Preparing: INSERT INTO `t_blog` (`id`,`create_time`,`update_time`,`create_by`,`update_by`,`deleted`,`title`,`content`,`url`,`star`,`score`,`status`,`order`,`is_top`,`top`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
==> Parameters: 500(String),2000-01-02T01:01:01(LocalDateTime),2000-01-02T01:01:01(LocalDateTime),500(String),500(String),false(Boolean),title500(String),content500(String),http://blog.easy-query.com/500(String),500(Integer),1.2(BigDecimal),1(Integer),1.2(BigDecimal),false(Boolean),false(Boolean)
==> Parameters: 300(String),2000-01-02T01:01:01(LocalDateTime),2000-01-02T01:01:01(LocalDateTime),300(String),300(String),false(Boolean),title300(String),content300(String),http://blog.easy-query.com/300(String),300(Integer),1.2(BigDecimal),1(Integer),1.2(BigDecimal),false(Boolean),false(Boolean)
==> Parameters: 400(String),2000-01-02T01:01:01(LocalDateTime),2000-01-02T01:01:01(LocalDateTime),400(String),400(String),false(Boolean),title400(String),content400(String),http://blog.easy-query.com/400(String),400(Integer),1.2(BigDecimal),1(Integer),1.2(BigDecimal),false(Boolean),false(Boolean)
<== Total: -6

原因可能

来自网上的说法

executeBatch方法会返回一个int数组

int[] executeBatch() throws SQLException;

数组各值可能是以下之一:

大于或等于零的数字,表示命令已成功处理,并且是更新计数,给出了
数据库中受命令影响的行数执行
SUCCESS_NO_INFO ( -2)的值,表示命令为处理成功,但受影响的行数为未知
如果批量更新中的命令之一无法正确执行,此方法引发BatchUpdateException,JDBC driver可能会也可能不会继续处理剩余的命令。但是driver的行为是与特定的DBMS绑定的,要么总是继续处理命令,要么从不继续处理命令。如果驱动程序继续处理,方法将返回 EXECUTE_FAILED(-3)。
————————————————
版权声明:本文为CSDN博主「左林右李02」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011624157/article/details/110734184open in new window

相关搜索

批量提交 批量插入 批量操作 批处理

上次编辑于:
贡献者: Hoysing