首页 > 数据库 >MySQL JDBC连接参数rewriteBatchedStatements(转)

MySQL JDBC连接参数rewriteBatchedStatements(转)

时间:2024-08-06 10:19:26浏览次数:11  
标签:10 JDBC MySQL rewriteBatchedStatements mysql where id

原文:https://blog.51cto.com/u_16213583/9701812

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行。不过,驱动具体是怎么样批量执行的?你是不是需要看一下内幕,才敢放心地使用这个选项?参见 MySQL JDBC官网 https://dev.mysql.com/doc/connectors/en/connector-j-connp-props-performance-extensions.html

下文会给出测试。

另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。为此我做了一些实验(详见下文),结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句。

注:本文使用的mysql驱动版本是5.1.12

实验记录:未打开rewriteBatchedStatements时
未打开rewriteBatchedStatements时,根据wireshark嗅探出的mysql报文可以看出,

batchDelete(10条记录)  =>  发送10次delete 请求

batchUpdate(10条记录)  =>  发送10次update 请求

batchInsert(10条记录)  =>  发送10次insert 请求

也就是说,batchXXX()的确不起作用

实验记录:打开了rewriteBatchedStatements后,配置如下

##配置链接mysql的时候将参数添加上并且将参数设置成true
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/learn_a?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
    username: *******
    password: *******
    driver-class-name: com.mysql.cj.jdbc.Driver

 

打开rewriteBatchedStatements后,根据wireshark嗅探出的mysql报文可以看出

 

batchDelete(10条记录)  =>  发送一次请求,内容为”delete from t where id = 1; delete from t where id = 2; delete from t where id = 3; ….”

batchUpdate(10条记录)  =>  发送一次请求,内容为”update t set … where id = 1; update t set … where id = 2; update t set … where id = 3 …”

batchInsert(10条记录)  =>   发送一次请求,内容为”insert into t (…) values (…) , (…), (…)”

 

对delete和update,驱动所做的事就是把多条sql语句累积起来再一次性发出去;而对于insert,驱动则会把多条sql语句重写成一条风格很酷的sql语句,然后再发出去。 官方文档说,这种insert写法可以提高性能(”This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements”)

一个注意事项
需要注意的是,即使rewriteBatchedStatements=true, batchDelete()和batchUpdate()也不一定会走批量: 当batchSize <= 3时,驱动会宁愿一条一条地执行SQL。所以,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch。

Add by zhj: 也有人测试说当batchSize>1时就会走批量方式,参见 https://blog.csdn.net/weixin_43343127/article/details/133683038

标签:10,JDBC,MySQL,rewriteBatchedStatements,mysql,where,id
From: https://www.cnblogs.com/ajianbeyourself/p/18344622

相关文章

  • Mysql配置主从
    1.检查将要配置主从数据库的服务器a.两台数据库版本保持一致b.两台数据库数据保持一致c.两台数据库IP可以互相访问规约,假设主库IP为:192.168.56.102从库IP为:192.168.56.1032.修改主库配置#vim/etc/my.cnf   [mysqld]   log-bin=mysql-bin  //[必须]启用二......
  • 银河麒麟V10(ARM) 离线安装 MySQL
    银河麒麟V10(ARM)离线安装MySQL参考教程:https://www.cnblogs.com/liuweida/p/17105179.htmlhttps://www.cnblogs.com/wshisboy/p/16374015.html1.MySQL8.0.29版本下载直接官网下载:https://dev.mysql.com/downloads/mysql/选择版本:2.安装MySQL2.1删除原有的mariad......
  • 【MySQL】库操作,数据类型
    目录MySQL简介SQL语句分类库操作语句展示数据库创建数据库使用数据库删除数据库数据类型整型浮点型字符串日期类型MySQL简介数据库有关系型数据库和非关系型数据库。关系型数据库:是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,......
  • openEuler24安装Mysql8
    openEuler社区版安装MySQL8版本时:rpm-qa|grep-imysql*没有显示。因此去openEuler的官方源仓库,找MySQL的包(本机使用虚拟机,因此选了x86),repo.openeuler.org/openEuler-24.03-LTS/everything/x86_64/Packages/ wget  https://repo.openeuler.org/openEuler-24.03-L......
  • 后端MyBatis连接Mysql数据库时常见报错
     目录报错情况报错情况一:​编辑报错情况二:解决步骤一、解决命名问题1.mapper层的id是否和Dao层的方法名字相同2.检查namespace与Dao层的文件地址相同二、解决注解问题1.检查Controller层的注解是否正确和完整2.Dao层或者Mapper层的注解3.pojo层:实体类层Data注解(用......
  • 云计算实训21——mysql-8.0.33-linux-glibc安装及使用
    一、mysql-8.0.33-linux-glibc安装安装步骤1.解压tar-xvfmysql-8.0.33-linux-glibc2.12-x86_64.tar.xz2.清空其他环境rm-rf/etc/my.cnf3.安装依赖库yumlistinstalled|greplibaio4.创建用户useradd-r-s/sbin/nologinmysql查看idmysql5.创建......
  • mysql8.0.33绿色版本安装以及用法
    绿色mysqlMySQL官网MySQL::DownloadMySQLCommunityServer(ArchivedVersions)[root@mysql~]#rm-rf/etc/my.cnf[root@mysql~]#find/-name"*mysql*"-execrm-rf{}\;        //清除以前的环境[root@mysql~]#tar-xvfmysql-8.0.33-li......
  • mysql:使用乐观锁保护数据一致性和完整性
    在数据库操作中,保持数据一致性和完整性至关重要。乐观锁(OptimisticLock)是一种不锁定资源的锁机制,它在数据更新时才会检测是否发生冲突。本文将介绍乐观锁的概念、使用方法、优缺点,并特别罗列它与悲观锁的区别。乐观锁的概念乐观锁基于这样一个假设:数据冲突并不频繁发生,因此在读......
  • mysql 行级锁(按照粒度分类)
    MySQL支持多种锁机制,以确保数据的一致性和完整性。其中,行级锁(Row-LevelLocking)是一种细粒度的锁机制,能够锁定单行数据,从而允许高并发访问。本文将简要介绍MySQL行级锁的概念、使用场景及其优缺点。行级锁的概念行级锁是一种细粒度的锁机制,允许事务在操作数据时仅锁定特定的行,而......
  • mysql:使用悲观锁保护数据完整性
    在数据库操作中,确保数据一致性和完整性至关重要。悲观锁(PessimisticLock)是一种锁机制,它在读取数据时就对其加锁,从而防止其他事务同时修改该数据。本文将介绍悲观锁的概念、使用方法,以及它的优点和缺点。悲观锁的概念悲观锁是一种认为并发操作总会发生冲突的锁机制。当一个事务......