`
DDT_123456
  • 浏览: 16282 次
社区版块
存档分类
最新评论

介绍MySQL Jdbc驱动的rewriteBatchedStatements参数

 
阅读更多

(转) http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html

感谢作者分享。


介绍MySQL Jdbc驱动的rewriteBatchedStatements参数

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

 

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL(jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你是不是需要看一下内幕,才敢放心地使用这个选项? 下文会给出答案。

 

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

 

 

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

 

 

实验记录:未打开rewriteBatchedStatements

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

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

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

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

 

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

 

实验记录:打开了rewriteBatchedStatements

打开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 (…) , (…), (…)”

 

deleteupdate,驱动所做的事就是把多条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.

 

 

对应的代码

最后可以看下对应的MySQL  JDBC驱动的代码,以加深印象:

 

clip_image002[4]

 

 

分享到:
评论

相关推荐

    jdbc核心代码.docx

    不同的数据库管理系统需要不同的JDBC驱动程序,例如MySQL的JDBC驱动程序为mysql-connector-java-8.0.21.jar。 2. 创建连接 使用DriverManager类的getConnection()方法创建一个连接对象,连接对象是JDBC的核心对象...

    由BatchSqlUpdate引发的思考-V1.4.doc

    经查阅官方文档,笔者了解到如果需要批量操作则需要开启 rewriteBatchedStatements 参数,而 JDBC 的 5.1 版本驱动默认的是 false。于是笔者在数据库连接上添加属性 rewriteBatchedStatements=true,并再次测试,...

    mysql-connector-java-8.0.27

    1. **JDBC驱动类型**:MySQL Connector/J属于Type 4 JDBC驱动,提供了纯Java实现,无需安装任何额外的客户端库,可以在任何支持Java的平台上运行。 2. **连接配置**:通过提供数据库URL、用户名和密码,开发者可以...

    mysql-connector-java-5.1.34.zip

    这个版本的驱动是基于 JDBC(Java Database Connectivity)接口的,使得开发者可以使用纯 Java 代码与 MySQL 数据库进行交互,无需依赖操作系统特定的数据库连接方式。以下是关于 MySQL Connector/J 5.1.34 的详细...

    关于Spring的JDBC连接mysql.docx

    在传统的JDBC操作中,我们通常需要手动创建数据库连接、预编译SQL语句、设置参数、执行查询或更新,并最后关闭连接。例如,在提供的代码片段中,`Student`类是数据实体,包含了ID、姓名和密码属性。在`TestJdbc`类的...

    mysql-connector-java-8.0.26.jar

    1. **JDBC 驱动介绍**:JDBC 是 Sun Microsystems 提出的一种用于在 Java 平台上访问数据库的标准接口,使得 Java 程序可以使用统一的方式连接多种数据库。MySQL Connector/J 是 MySQL 官方提供的符合 JDBC 规范的 ...

    mysql-connector-java-5.1.25

    MySQL Connector/J 5.1.25 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于JDBC(Java Database Connectivity)的驱动程序,使得Java开发者能够方便地在Java应用中访问和操作MySQL数据库。这个版本是MySQL...

    mysql-connector-java-3.0.9-stable.rar

    9. **性能优化**:通过配置连接参数(如useServerPrepStmts、rewriteBatchedStatements等),可以进一步优化驱动性能。 10. **兼容性**:此版本的驱动通常兼容多个MySQL服务器版本,但可能不包括最新特性或优化,...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    而`rewriteBatchedStatements=true`则是让MySQL驱动程序自己重写批处理语句,使其在服务器端执行时更高效。 此外,代码中的日期比较显示了运行时间,这可以帮助我们评估批量处理的效率。在实际应用中,可以通过调整...

    使用JDBC在MySQL数据库中如何快速批量插入数据

    - **重写批处理语句**:在MySQL中,可以通过设置`rewriteBatchedStatements=true`(如注释所示)来启用批处理语句的重写,这样多个`INSERT`语句会被合并成一个大的`INSERT`语句,提高效率。 - **使用批量缓存**:...

    sonar安装配置指南(sonar+MySQL+ant)原创

    本指南将详细介绍如何在环境中安装配置Sonar,同时使用MySQL作为数据存储,并通过Ant构建工具调用Sonar任务。以下是详细的步骤: 1、安装Sonar 3.1.1 首先,下载Sonar的版本3.1.1(sonar-3.1.1.zip),将其解压缩至...

    Insert测试1

    这个参数告诉JDBC驱动程序重写批处理语句,以减少网络往返次数,从而提升性能。此外,其他参数如`useUnicode=true`, `characterEncoding=UTF8`, `useSSL=false`和`serverTimezone=UTC`分别用于设置字符集、禁用SSL...

    解决openfire 4.1中文乱码.docx

    针对MySQL数据库,你需要在jdbc连接字符串中包含特定的参数来设定字符集。正确的格式如下: ``` jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&...

    openfire安装---及时聊天

    - JDBC 驱动程序类保持默认; - 数据库 URL 格式为 `jdbc:mysql://[hostname]:3306/[database_name]?rewriteBatchedStatements=true`,其中 `[hostname]` 为服务器 IP,`[database_name]` 为数据库名称; - 输入...

    酒店预订源代码.txt

    - **数据库驱动**:`com.mysql.cj.jdbc.Driver` - **连接URL**:`jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true` - **用户名**:`...

    mybatis-spring.docx

    rewriteBatchedStatements=true"/&gt;\n &lt;property name="username" value="root"/&gt;\n &lt;property name="password" value="123456"/&gt;\n&lt;/bean&gt;\n```\n这里配置了 MySQL 数据库的驱动、连接地址、用户名和密码。...

Global site tag (gtag.js) - Google Analytics