MyBatis批处理性能优化:rewriteBatchedStatements与allowMultiQueries实战解析

使用rewriteBatchedStatements属性优化Mybatis-Plus批量插入数据 由于项目是使用MyBatis-Plus开发的,用起来也确实比较方便,尤其是service层封装好的一些通用的增删改查方法,省去了不少sql语句的书写,但是在开发过程中,我也发现MyBatis-Plus的saveBatch批量插入方法针对MySQL数据库可能会出现效率贼低的情况,通过不断查询资料发现可以通过加rewriteBatchedStatements参数来解决(保证5.1.13以上版本)。 阅读详情

1. 为什么你的MyBatis批量插入还是那么慢?

如果你用过MyBatis或者MyBatis-Plus的saveBatch方法,可能会发现一个奇怪的现象:明明代码里调用了批量插入,但实际执行时,数据库监控里看到的还是一条条单独的INSERT语句,速度跟单条插入没什么区别。我刚开始用的时候也踩过这个坑,折腾了半天才发现,问题出在一个关键的连接参数上。

简单来说,MyBatis的批量操作底层依赖的是JDBC的PreparedStatement.addBatch()和executeBatch()方法。但是,MySQL的JDBC驱动(Connector/J)在默认情况下,根本不会真正批量执行这些语句! 它会假装支持批量,实际上却在背后把我们的批量请求拆成一条条单独的SQL,再依次发给数据库。这样一来,网络往返次数(Round-Trips)一点没减少,性能自然上不去。

这就像是你想用卡车一次性运十箱货,结果司机非要把货拆开,一次只搬一箱,来回跑十趟。效率能高才怪。

那么,怎么让司机听话,真的用卡车一次性运走呢?这就需要我们今天要深入探讨的两个核心配置参数:rewriteBatchedStatements 和 allowMultiQueries。它们就像是给JDBC司机下的两道指令,决定了批量操作到底以何种方式、多大力度去执行。

我会结合自己多年的实战经验,用最直白的语言和可复现的案例,带你彻底搞懂这两个参数。你会发现,仅仅是加一个简单的配置,就能让批量插入的性能提升十几倍甚至几十倍。我们先从一个最直接的性能对比开始,感受一下差距有多大。

2. rewriteBatchedStatements:批量插入的“性能倍增器”

2.1 它到底是什么?解决了什么问题?

rewriteBatchedStatements,直接翻译是“重写批处理语句”。这个参数是MySQL JDBC驱动(Connector/J)提供的一个优化开关。

它的核心作用是这样的: 当你开启它(设置为true),并且使用PreparedStatement进行批量插入(INSERT)时,JDBC驱动会做一个“小动作”。它不再发送多条独立的INSERT INTO ... VALUES (...)语句,而是会把这些语句在客户端重写成一条多值语句:INSERT INTO ... VALUES (...), (...), (...)。

举个例子,假设你批量插入3条记录:

  • 未开启时,网络传输的是:
    INSERT INTO user (name) VALUES ('张三');
    INSERT INTO user (name) VALUES ('李四');
    INSERT INTO user (name) VALUES ('王五');
    
  • 开启后,网络传输的是:
    INSERT INTO user (name) VALUES ('张三'), ('李四'), ('王五');
    

别看只是语法上的变化,这对性能的影响是巨大的。减少网络传输的语句数量,直接降低了网络延迟和协议解析的开销。对于需要插入成千上万条数据的场景,这带来的性能提升是指数级的。

2.2 如何配置与验证效果

配置非常简单,只需要在连接MySQL的JDBC URL后面加上这个参数即可。

标准的配置姿势:

# 在application.yml或application.properties中
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

或者,如果你用的是Druid、HikariCP等连接池,也是在数据源配置的jdbc-url里加上它。

光说不练假把式,我们来做个实测。 我写了一个简单的测试,对比开启和不开启rewriteBatchedStatements的情况下,插入50万条数据的耗时。为了排除框架干扰,这里先用最原生的JDBC来演示。

public class BatchInsertBenchmark {
    public static void main(String[] args) throws Exception {
        // 测试数据量
        int totalRecords = 500000;
        int batchSize = 5000; // 每批提交5000条
        
        // 情况1:不使用批处理优化(默认)
        String urlWithout = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai";
        // 情况2:使用批处理优化
        String urlWith = "jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useSSL=false&serverTimezone=Asia/Shanghai";
        
        // 分别测试
        testBatchInsert("未开启 rewriteBatchedStatements", urlWithout, totalRecords, batchSize);
        testBatchInsert("已开启 rewriteBatchedStatements", urlWith, totalRecords, batchSize);
    }
    
    private static void testBatchInsert(String desc, String url, int total, int batchSize) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        try (Connection conn = DriverManager.getConnection(url, "root", "password")) {
            conn.setAutoCommit(false);
            String sql = "INSERT INTO batch_test (data) VALUES (?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            
            long start = System.currentTimeMillis();
            for (int i = 1; i <= total; i++) {
                pstmt.setString(1, "data-" + i);
                pstmt.addBatch();
                
                if (i % batchSize == 0) {
                    pstmt.executeBatch();
                    conn.commit();
                }
            }
            // 处理最后一批
            pstmt.executeBatch();
            conn.commit();
            long end = System.currentTimeMillis();
            
            System.out.printf("%s => 插入 %d 条记录,耗时: %.2f 秒%n", 
                desc, total, (end - start) / 1000.0);
        }
    }
}

运行结果对比(基于我的本地测试环境):

  • 未开启 rewriteBatchedStatements:插入50万条,耗时约 32秒。
  • 已开启 rewriteBatchedStatements:插入50万条,耗时约 2.1秒。

性能提升了超过15倍! 这个差距足以说明,在涉及批量插入的场景下,这个参数是必须打开的。它几乎没有任何副作用,却能带来巨大的性能收益。

2.3 深入原理与注意事项

理解了它的威力,我们再来深入看看它的工作原理和一些容易被忽略的细节。

1. 它只对INSERT语句有“重写”效果吗? 网上有些资料说rewriteBatchedStatements只对INSERT有效,这个说法不完全准确。实际上:

  • 对INSERT:效果最好,会将多条VALUES子句合并。
  • 对UPDATE和DELETE:驱动不会进行语法重写,但依然会将多个语句打包在一次网络请求中发送(类似于用分号;隔开),这同样减少了网络往返次数,也能获得性能提升,只是不如INSERT的合并效果那么显著。

2. 驱动版本要求 要获得稳定可靠的批量重写功能,建议使用 MySQL Connector/J 5.1.13 及以上版本。更老的版本可能支持不完善或有Bug。现在项目一般都用8.x版本了,这点通常不是问题。

3. 一个关键的“小聪明” JDBC驱动其实很“聪明”,它不会无脑合并。当你的batchSize(批处理大小)很小(比如小于等于3)时,驱动会认为合并带来的收益抵不上重写的开销,反而会选择逐条执行。 所以,为了确保批处理生效,建议设置的批处理大小至少大于3,在实际生产中,根据数据量,设置几百到几千都是常见的。

4. 与MyBatis/MyBatis-Plus的配合 如果你直接使用MyBatis的SqlSession并指定ExecutorType.BATCH,或者使用MyBatis-Plus的saveBatch、updateBatchById方法,底层调用的就是PreparedStatement.addBatch()。因此,只要数据库连接URL中配置了rewriteBatchedStatements=true,这些框架的批量方法就能自动获得性能提升,无需修改业务代码。

3. allowMultiQueries:多条SQL执行的“通行证”

3.1 它与rewriteBatchedStatements有何不同?

如果说rewriteBatchedStatements是JDBC驱动在背后偷偷优化,那么allowMultiQueries就是给你一把钥匙,允许你主动地在一条请求中执行多条SQL语句。

它的作用很明确: 允许在同一个PreparedStatement或Statement中,执行由分号(;)分隔的多个SQL语句。

默认情况下,出于安全考虑(防止SQL注入攻击的一种方式),MySQL驱动是不允许这样做的。如果你在Java代码中试图执行"SELECT * FROM user; DELETE FROM log;"这样的字符串,会直接抛出异常。

那么,它和批处理有什么关系呢? 关系在于,当你需要执行批量更新或批量删除,并且这些语句之间没有关联(无法用IN语句或CASE WHEN统一表达)时,allowMultiQueries提供了一种解决方案。你可以在MyBatis的Mapper XML中,手动编写用分号分隔的多条SQL。

3.2 在MyBatis中的实战用法

配置同样简单,追加到JDBC URL即可:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?allowMultiQueries=true&rewriteBatchedStatements=true&...

实战场景: 假设有一个需求,在插入一条新闻的同时,需要往消息表里插入一条相关的通知记录。我们希望这两个操作在一个数据库事务中完成,并且只和数据库交互一次。

在MyBatis的Mapper XML文件中,我们可以这样写:

<insert id="insertNewsWithMessage" parameterType="News">
    <!-- 插入新闻 -->
    INSERT INTO tb_news (title, content, creator_id, create_time)
    VALUES (#{title}, #{content}, #{creatorId}, NOW());
    
    <!-- 插入关联消息,使用刚插入新闻的ID -->
    INSERT INTO tb_message (title, ref_id, type, create_time)
    VALUES (#{title}, LAST_INSERT_ID(), 'NEWS_NOTICE', NOW());
</insert>

注意,两条SQL之间用分号;隔开。当调用这个insertNewsWithMessage方法时,MyBatis会将整段字符串发给MySQL。由于我们开启了allowMultiQueries=true,MySQL会依次执行这两条语句。

这种方式的优势:

  1. 减少网络交互:两个操作一次往返完成。
  2. 保证原子性:在一个数据库会话中执行,要么全成功,要么全失败。
  3. 使用LAST_INSERT_ID()等函数方便地获取上一条插入的自增ID,用于后续操作。

3.3 重要的安全警告与限制

在开启allowMultiQueries之前,你必须清醒地认识到它的风险!

1. SQL注入风险急剧升高 这是最大的安全隐患。如果你的SQL语句是通过字符串拼接生成的,并且用户输入未经严格过滤,攻击者可能会利用分号注入额外的恶意SQL语句。例如,原本是SELECT * FROM user WHERE id = ${id},如果id参数被传入1; DROP TABLE user; --,后果不堪设想。

因此,强烈建议:

  • 永远不要在开启allowMultiQueries的SQL中使用${}进行字符串拼接。
  • 必须使用#{}预编译占位符。预编译机制会确保用户输入被当作数据而非SQL指令处理,从而从根本上杜绝注入。

2. 动态SQL标签的兼容性问题 根据我踩坑的经验,MyBatis的动态SQL标签(如<if>、<where>、<foreach>)可能无法在allowMultiQueries模式下的多条语句中正常工作。MyBatis在解析动态SQL时,可能会对分号的处理产生混淆。通常,这种“手动分号批处理”更适合用于静态的、固定的多条SQL组合。

3. 与特定连接池的兼容性 一些连接池(如早期版本的Druid)可能对allowMultiQueries有额外的限制或需要特殊配置。如果遇到multi-statement not allow这类错误,需要查阅对应连接池的文档,通常需要在其配置中也允许执行多语句。

4. 强强联合:组合使用的最佳实践与陷阱

在实际项目中,我们通常会把rewriteBatchedStatements和allowMultiQueries一起打开,以获得全面的批量操作能力。但组合使用,也意味着要同时考虑它们各自的特点和可能产生的化学反应。

4.1 如何配置最稳妥?

一个经过生产环境检验的、比较完整的MySQL JDBC URL配置示例如下:

spring.datasource.url=jdbc:mysql://localhost:3306/your_db?
useUnicode=true&
characterEncoding=UTF-8&
useSSL=false&
serverTimezone=Asia/Shanghai&
# 批处理核心优化
rewriteBatchedStatements=true&
# 允许执行多语句(谨慎使用)
allowMultiQueries=true&
# 服务端预编译,提升重复SQL性能
useServerPrepStmts=true&
# 缓存预编译语句
cachePrepStmts=true&
# 预编译语句缓存大小
prepStmtCacheSize=250&
# 可缓存的SQL最大长度
prepStmtCacheSqlLimit=2048&
# 使用性能优化配置集(包含多项优化)
useConfigs=maxPerformance

参数解读:

  • useServerPrepStmts & cachePrepStmts:这两个是“黄金搭档”,用于开启服务端预编译并缓存,对于高并发重复SQL场景性能提升明显。
  • useConfigs=maxPerformance:这是一个“快捷方式”,它会启用一整套MySQL驱动认为的性能优化配置(其中就包含了cachePrepStmts=true)。

4.2 一个已知的Bug与规避方案

这里需要特别提到一个重要的技术细节,也是很多开发者容易忽略的坑。在MySQL Connector/J的某些版本中,当同时开启 rewriteBatchedStatements=true 和 useServerPrepStmts=true 时,进行批量更新操作可能会触发一个驱动层面的Bug。

这个Bug可能导致更新语句被错误地重写或执行异常。MySQL官方和社区给出的临时解决方案是:同时配置 allowMultiQueries=true。

是的,你没看错。为了解决rewriteBatchedStatements和useServerPrepStmts组合的Bug,需要把第三个参数allowMultiQueries也打开。这听起来有点奇怪,但确实是很多经验文档(包括TiDB等兼容MySQL的数据库最佳实践指南)中推荐的做法。

所以,如果你的应用涉及批量更新,并且使用了服务端预编译, safest的做法就是把这三个参数一起配上。

4.3 性能对比与选型指南

为了更直观,我把不同场景下的优化选择总结成了下面这个表格:

操作场景推荐配置原理与效果
大批量数据插入rewriteBatchedStatements=true将多条INSERT重写为VALUES(),(),(),性能提升最大,可达10倍以上。
大批量数据更新/删除rewriteBatchedStatements=true
allowMultiQueries=true
将多条语句打包为一次网络请求发送,减少网络延迟,有稳定提升。
MyBatis中手动执行多条无关SQLallowMultiQueries=true允许在Mapper XML中用分号写多条SQL,实现一次请求完成多个操作。
使用MyBatis-Plus的saveBatchrewriteBatchedStatements=true框架底层已用addBatch(),此配置使其真正生效。
高并发重复简单SQLuseServerPrepStmts=true
cachePrepStmts=true
启用服务端预编译缓存,大幅减少SQL解析开销。

选型心法:

  • 追求极致插入性能:无脑开rewriteBatchedStatements。
  • 需要执行复杂批量业务SQL:考虑开allowMultiQueries,但务必做好防注入。
  • 生产环境通用配置:rewriteBatchedStatements=true + allowMultiQueries=true + useServerPrepStmts=true + cachePrepStmts=true,这是一个兼顾性能、功能和安全性的组合拳。

5. 超越配置:MyBatis批处理的本质与更多优化思路

配置参数是“术”,理解本质才是“道”。要真正玩转MyBatis批处理,我们还得再往下挖一层。

5.1 MyBatis批处理的三种执行器

MyBatis的SqlSession有三种执行器,通过openSession(ExecutorType type)指定:

  • SIMPLE(默认):每执行一条语句就创建一个新的PreparedStatement。
  • REUSE:复用PreparedStatement对象。
  • BATCH:使用批处理执行器,将多个更新语句攒起来,在commit或flushStatements时一次性执行。

当你使用MyBatis-Plus的saveBatch时,它内部其实就是帮你创建了一个ExecutorType.BATCH的会话。所以,框架的批量方法生效的前提,是JDBC驱动支持真正的批处理(即rewriteBatchedStatements=true)。

5.2 手动SQL拼接:另一种“批处理”思路

除了依赖JDBC批处理,MyBatis还有一种常见的批量操作写法:使用<foreach>标签进行SQL拼接。

<insert id="insertBatch">
    INSERT INTO user (name, age) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

这种方式和rewriteBatchedStatements有什么区别?

  • 手动拼接:在MyBatis层面生成一条INSERT ... VALUES (..), (..), (..)的长SQL。它不依赖rewriteBatchedStatements参数,但需要数据库本身支持这种多值语法(MySQL支持)。它的缺点是SQL长度可能超限(受max_allowed_packet限制),且无法享受预编译批处理的某些优化。
  • JDBC批处理:依赖驱动重写。优势是驱动会智能处理,并且与预编译配合更好。在大多数情况下,开启rewriteBatchedStatements的JDBC批处理方式性能更优、更省心。

5.3 务必要注意的“批次大小”

无论是哪种批处理,都不是一次性把所有数据都塞进去就好。批次大小(Batch Size)是一个需要调优的关键参数。

  • 太小(如10):网络往返次数仍然很多,优化效果有限。
  • 太大(如10万):单次请求数据包巨大,可能撑满网络缓冲区或数据库内存,导致传输变慢甚至OOM。同时,数据库事务锁持有时间过长,影响并发。

如何设置? 没有一个绝对数值,需要根据数据行大小、数据库负载进行测试。一个常见的经验值是 500到5000 之间。你可以像下面这样,在代码中灵活控制:

// MyBatis-Plus 示例
List<User> userList = ... // 大量数据
int batchSize = 1000;
for (int i = 0; i < userList.size(); i += batchSize) {
    List<User> subList = userList.subList(i, Math.min(i + batchSize, userList.size()));
    userService.saveBatch(subList); // 分批提交
}

5.4 监控与验证:如何确认优化真的生效了?

配置加好了,代码写完了,怎么知道rewriteBatchedStatements真的在起作用呢?

1. 查看数据库通用日志(General Log) 在MySQL中临时开启通用日志,可以看见所有收到的SQL语句。

SET GLOBAL general_log = 1;

然后执行你的批处理程序。观察日志,如果看到的是长长的多值INSERT语句,说明优化生效;如果看到大量单条INSERT,说明没生效。

2. 使用性能监控工具 像Arthas、SkyWalking这类APM工具,可以监控到应用发起的数据库调用次数和耗时。优化生效后,你会看到对于批量插入,调用次数会从N次(数据条数)急剧下降到几次(批次数)。

3. 最简单的日志判断 在你的JDBC URL中加上profileSQL=true参数,MySQL驱动会将执行的SQL信息输出到日志。不过生产环境慎用,日志量会很大。

在我经历的一个数据迁移项目中,开启rewriteBatchedStatements后,原本需要数小时的千万级数据导入任务,缩短到了二十分钟内完成。这种性能提升是实实在在、肉眼可见的。优化从来不是纸上谈兵,而是每一次配置调整和代码实践中积累出来的真功夫。希望这篇实战解析,能帮你彻底掌握这两个关键参数,让你在应对海量数据操作时更加游刃有余。

mybatis的批处理(效率)之rewriteBatchedStatements和allowMultiQueries mybatis的批处理效率小结 内容说明: mysql数据库为例 rewriteBatchedStatements=true:批量将数据传给mysql allowMultiQueries=true:允许一次性执行多条sql 更多配置项 ==> 资料入口 文章目录mybatis的批处理效率小结一:说明rewriteBatchedStatements1、如何配置2、引入依赖3、测试案例(使用原生jdbc测试)4、运行结果:4、注意事项和小结:二、说明allowMultiQueries1、如何配置2、 阅读详情

相关推荐

51单片机IAP在线升级实战:从Bootloader设计到HEX文件合并

本文详细介绍了51单片机IAP在线升级的完整实战方案,重点解析了Bootloader的设计原理与内存分区规划。通过配置Keil工程实现代码地址偏移,并利用XMODEM协议进行串口通信,完成固件传输。最后提供了Bootloader与APP的HEX文件合并方法,便于量产烧录,显著提升产品可维护性。

earth的博客 450

mysql批量插入性能优化:executeBatch如何通过rewriteBatchedStatements参数逆袭

本文主要介绍在采用executeBatch进行mysql批量数据插入时,通过在mysql连接信息中添加`rewriteBatchedStatements=true`使得执行效率大幅提升。

弹指天下 1万+

避坑指南:MyBatis多语句执行报错?allowMultiQueries参数的正确打开方式

本文深入解析MyBatis执行多条SQL语句时常见的“multi-statement not allow”报错,并提供了完整的解决方案。核心在于正确配置数据库连接参数,特别是`allowMultiQueries`参数以启用多语句执行,同时结合`rewriteBatchedStatements`参数实现真正的批量操作性能飞跃。文章详细对比了不同配置下的性能差异,并给出了连接池兼容性、事务管理、安全实践及不同环境下的配置模板,是解决MyBatis批量执行与性能优化的实用指南。

weixin_29205061的博客 589

mybatis-plus优化-rewriteBatchedStatements飞速提升

深入了解rewriteBatchedStatements优化过程

常有理爱摸鱼 6700

MyBatis批量更新性能优化:四种方案原理、选型与实战避坑指南

在数据库操作中,批量更新是提升数据处理效率的关键技术,尤其在面对大量数据同步、状态批量变更等场景时,其性能直接影响系统吞吐量。其核心原理在于减少应用与数据库之间的网络往返次数,并利用数据库自身的批处理优化机制。从技术价值看,有效的批量更新能显著降低数据库连接压力、缩短事务时间,是后端性能优化的重要环节。常见应用场景包括后台管理系统的批量审核、订单物流状态批量更新以及数据清洗校正等。本文聚焦于MyBatis框架下的批量更新实现,深入解析了foreach动态SQL、Batch执行器、ON DUPLICATE K

weixin_34221773的博客 364

Spring JDBC深度解析:连接治理、事务协同与生产级调优

JDBC是Java数据库交互的底层契约,而Spring JDBC并非简单封装,而是面向高并发、多数据源、强一致场景的连接治理协议。其核心在于统一异常体系(DataAccessException)、线程安全的Connection生命周期管理(依托DataSource与TransactionSynchronizationManager),以及与HikariCP等连接池的深度协同。技术价值体现在可控的SQL执行路径、零ORM开销的精准资源调度、跨数据库的异常语义抽象。典型应用场景包括金融系统DAO层重构、MyBa

chuliaoqiao4046的博客 410

Mysql使用Mybatis的书写格式

Mysql使用Mybatis的书写格式

感谢所有乐于奉献的人,在此不一一具名 400

ADC INL&DNL测试方法和实例

本文介绍了一种可操作的ADC INL和DNL的测试方法--直方图法(也称码密度法)。并实际使用该方法测试了两款芯片的ADC INL和DNL

APTCHIP的博客 1万+

Mybatis-Plus批量插入数据太慢,使用rewriteBatchedStatements属性优化,堪称速度与激情!

rewriteBatchedStatements神秘属性前言一、rewriteBatchedStatements参数二、批量添加员工信息1.普通saveBatch批量插入2.设置rewriteBatchedStatements=true批量插入总结 前言 最近小编手上一堆项目,实在特别忙,每天一堆批量操作,更新、导入、新增、删除,公司使用的Mybatis-Plus操作SQL,用过Mybatis-Plus的小伙伴一定知道他有很多API提供给我们使用,真爽,再不用写那么多繁琐的SQL语句,saveBatch是

日常分享工作中的一些技术干货。 9417

CCS配置MSPM0G3507(七) 编码器(TIMER-QEI)

1.选择时钟源 BUSCLK2.时钟分频配置为1分频3.分频系数配置为14.若勾选 Start ,则生成程序后会自动开启定时器的计数,否则需手动在程序中开启5.Load Value 设置为65535。

kaneki_lh的博客 1万+

集成电路设计笔记(七)UVLO设计

1. 什么是UVLO 欠压锁定(Undervoltage-Lockout)简称UVLO,是电子设备中在电源电压低于正常工程准位时,切断电源的电路。在嵌入式系统中常会用UVLO监控电池电压,若电压低于一定值,会直接切断电源,保护嵌入式系统的电路。 许多电子设备中都有UVLO的功能,例如在镇流器中就有UVLO电路,若电压过低时直接切断电源。 UVLO就是低电压锁定; 低压关断. 欠压关断模式是当供电电压低于IC的开启门限电压时的一种保护模式。欠压关断模式可保证IC在供电电压不足时不致于被损坏。一个低电压锁定(

ccbirds 2万+

MyBatis Plus中的批量插入:通过开启rewriteBatchedStatements=true

在MyBatis Plus框架中,批量插入是一种高效的数据库操作方式。通过开启,可以获得许多优点,从而提高数据库插入性能、减轻负载以及简化代码。

jakelihua 3571

谷歌学术用publish-or-perish来对引用量排序

用谷歌学术搜索文献的时候发现不能按照引用量高低进行排序,网上提供了这个软件。 下载地址如下:Publish or Perish (harzing.com)https://harzing.com/resources/publish-or-perish 关于软件界面页面和各种指标的介绍,可以参考中科大的这个PPT: 文献分析软件——publish or perish(精品·公开课件).ppt (book118.com)https://max.book118.com/html/2018/1124/813

m0_48878989的博客 1万+

jdbc批量操作之rewriteBatchedStatements=true

作者:晚歌y 链接:https://www.jianshu.com/p/0f4b7bc4d22c 最近在优化大批量数据插入的性能问题。 项目原来使用的大批量数据插入方法是Mybatis的foreach拼接SQL的方法。 我发现不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,实际上在插入的时候仍然是一条条记录的插,速度远不如原来Mybatis的foreach拼接...

真是适合睡觉的天气 4253

台达PLC使用RS485Modbus指令通信

台达PLC,RS485,Modbus RTU,从站梯形图,0X01,0X02,0X05,CRC校验

lilililimu的博客 1万+

基于 Cognex VisionPro 的工业级图像匹配技术全解析

通过本文的深度解析,开发者可以系统掌握 Cognex VisionPro 图像匹配技术的核心原理、开发流程、优化策略及工业级应用。实际项目中,需结合具体场景灵活调整参数,综合运用预处理、特征提取和匹配算法,构建稳定可靠的视觉系统。

品质生活,极致编程。 1595

批量执行&rewriteBatchedStatements=true深入理解、深度分析。通过查询mysql日志深入理解

好的

lh155136的博客 1万+

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5911

MySQL JDBC 实战: PreparedStatement rewriteBatchedStatements 实现原理

在 MySQL 的 JDBC 驱动中,executeBatch` 方法有三种执行路径

SmartSi 1227

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 490

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Mybatis批处理数据插入(rewriteBatchedStatements参数)

以上为摘录出品,不过结果却是真实的,确实是这样。1、MySQL JDBC驱动在默认情况下会无视executeBatch()【也就是说JDBC默认情况下,会将你的语句分拆成单个,一条一条发给数据库执行,数据量小时感知不大,1w或10w以上差距越来越大】我们循环1万次,把每个对象装到员工集合(List)中,然后调用Mybatis-Plus的saveBatch方法,传入List集合,实现批量插入,然后我们在方法开始结束的地方,第一次:(19.341 秒)第二次:(接近2秒)第三次:(接近2秒)

m0_60769905的博客 1689

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【RuoYi-Vue-Plus】学习笔记 23 - Mybatis-Plus(五)批量插入功能(下篇)批处理参数 rewriteBatchedStatements

Mybatis-Plus 批量插入批处理参数 rewriteBatchedStatements 的分析。

MichelleChung的星球 3317

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

allowMultiQueries=true&rewriteBatchedStatements=true

rewriteBatchedStatements=true并且saveBatch

lc257的博客 1951

jdbc连接参数rewriteBatchedStatements优化学习

设置为 true 时,jdbc驱动程序会尝试把多个sql语句一次性发送到数据库执行,这样可以减少网络开销和数据库处理,从而提高性能。是一个在 JDBC 连接 URL 中的参数,它用于启用或禁用在 MySQL 中的批处理重写特性。不能在for循环中调用数据库发起更新等操作,因为数据量大的时候容易将连接池的连接耗尽。这个参数默认是关闭的。

mikelv01的博客 773

MySQL之rewriteBatchedStatements

网上很多文章,都说MySQL驱动并没有实现”真正的”batchUpdate,执行的时候还是一条一条按顺序将SQL发送到MySQL服务器,其实这是错误的。 先贴一段源码(基于MySQL 5.1.40驱动),执行batchUpdate的时候最终执行如下方法:executeBatchInternal protected long[] executeBatchInternal() throws S...

七夜 7337
上一篇: ControlNet模型全解析:从canny到openpose,14种预处理器怎么选?
下一篇: Android电量优化实战:Battery Historian深度解析与应用案例
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值