(转) http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html
感谢作者分享。
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条记录) => 发送10次delete 请求
batchUpdate(10条记录) => 发送10次update 请求
batchInsert(10条记录) => 发送10次insert 请求
也就是说,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 (…) , (…), (…)”
对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.
对应的代码
最后可以看下对应的MySQL JDBC驱动的代码,以加深印象:
分享到:
相关推荐
不同的数据库管理系统需要不同的JDBC驱动程序,例如MySQL的JDBC驱动程序为mysql-connector-java-8.0.21.jar。 2. 创建连接 使用DriverManager类的getConnection()方法创建一个连接对象,连接对象是JDBC的核心对象...
经查阅官方文档,笔者了解到如果需要批量操作则需要开启 rewriteBatchedStatements 参数,而 JDBC 的 5.1 版本驱动默认的是 false。于是笔者在数据库连接上添加属性 rewriteBatchedStatements=true,并再次测试,...
1. **JDBC驱动类型**:MySQL Connector/J属于Type 4 JDBC驱动,提供了纯Java实现,无需安装任何额外的客户端库,可以在任何支持Java的平台上运行。 2. **连接配置**:通过提供数据库URL、用户名和密码,开发者可以...
这个版本的驱动是基于 JDBC(Java Database Connectivity)接口的,使得开发者可以使用纯 Java 代码与 MySQL 数据库进行交互,无需依赖操作系统特定的数据库连接方式。以下是关于 MySQL Connector/J 5.1.34 的详细...
在传统的JDBC操作中,我们通常需要手动创建数据库连接、预编译SQL语句、设置参数、执行查询或更新,并最后关闭连接。例如,在提供的代码片段中,`Student`类是数据实体,包含了ID、姓名和密码属性。在`TestJdbc`类的...
1. **JDBC 驱动介绍**:JDBC 是 Sun Microsystems 提出的一种用于在 Java 平台上访问数据库的标准接口,使得 Java 程序可以使用统一的方式连接多种数据库。MySQL Connector/J 是 MySQL 官方提供的符合 JDBC 规范的 ...
MySQL Connector/J 5.1.25 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于JDBC(Java Database Connectivity)的驱动程序,使得Java开发者能够方便地在Java应用中访问和操作MySQL数据库。这个版本是MySQL...
9. **性能优化**:通过配置连接参数(如useServerPrepStmts、rewriteBatchedStatements等),可以进一步优化驱动性能。 10. **兼容性**:此版本的驱动通常兼容多个MySQL服务器版本,但可能不包括最新特性或优化,...
而`rewriteBatchedStatements=true`则是让MySQL驱动程序自己重写批处理语句,使其在服务器端执行时更高效。 此外,代码中的日期比较显示了运行时间,这可以帮助我们评估批量处理的效率。在实际应用中,可以通过调整...
- **重写批处理语句**:在MySQL中,可以通过设置`rewriteBatchedStatements=true`(如注释所示)来启用批处理语句的重写,这样多个`INSERT`语句会被合并成一个大的`INSERT`语句,提高效率。 - **使用批量缓存**:...
本指南将详细介绍如何在环境中安装配置Sonar,同时使用MySQL作为数据存储,并通过Ant构建工具调用Sonar任务。以下是详细的步骤: 1、安装Sonar 3.1.1 首先,下载Sonar的版本3.1.1(sonar-3.1.1.zip),将其解压缩至...
这个参数告诉JDBC驱动程序重写批处理语句,以减少网络往返次数,从而提升性能。此外,其他参数如`useUnicode=true`, `characterEncoding=UTF8`, `useSSL=false`和`serverTimezone=UTC`分别用于设置字符集、禁用SSL...
针对MySQL数据库,你需要在jdbc连接字符串中包含特定的参数来设定字符集。正确的格式如下: ``` jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&...
- JDBC 驱动程序类保持默认; - 数据库 URL 格式为 `jdbc:mysql://[hostname]:3306/[database_name]?rewriteBatchedStatements=true`,其中 `[hostname]` 为服务器 IP,`[database_name]` 为数据库名称; - 输入...
- **数据库驱动**:`com.mysql.cj.jdbc.Driver` - **连接URL**:`jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true` - **用户名**:`...
rewriteBatchedStatements=true"/>\n <property name="username" value="root"/>\n <property name="password" value="123456"/>\n</bean>\n```\n这里配置了 MySQL 数据库的驱动、连接地址、用户名和密码。...