Java mysql batch 提速 "rewriteBatchedStatements=true"

Mysql jdbc 批处理数据,需要给jdbc连接加上rewriteBatchedStatements=true。默认jdbc是不会开启批处理。

例如:jdbc:mysql://10.250.4.98:3306/dbname?rewriteBatchedStatements=true

 

Java UpdateBatchSample:

http://www.java2s.com/Code/Java/Database-SQL-JDBC/BatchupdateforMySQL.htm

 

官网forums

http://forums.mysql.com/read.php?39,260053,263456#msg-263456

MySQL itself has no real "batch" API for prepared statements. If you add the configuration property "rewriteBatchedStatements=true" to your JDBC connection string for Connector/J, the driver will rewrite batches of prepared INSERTs into multi-value form, and all other forms of statements into multi-statements, which does give a large performance gain (7-10x). 

 

注意:

jdbc driver 版本需要 5.1.8 及以上

 

### 如何在 JDBC 中设置和使用 `rewriteBatchedStatements=true` #### 设置方法 为了使批量操作更高效,在 MySQLJDBC 连接 URL 中添加 `rewriteBatchedStatements` 参数并将其设为 true。这确保了当调用 executeBatch 方法时,JDBC 驱动程序不会将 SQL 语句逐条发送到服务器而是作为一个批次来处理[^2]。 连接字符串示例如下所示: ```java String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"; Connection conn = DriverManager.getConnection(url, username, password); ``` 此配置适用于 MySQL Connector/J 版本 5.1.13 或更高版本。 #### 实现原理与效果 通常情况下,如果不启用该参数,则即使应用程序通过 API 调用了 batch 执行函数,实际上传输至数据库端的仍然是独立的单个请求序列;而一旦启用了 `rewriteBatchedStatements=true` 后,MySQL 客户端驱动将会尝试优化这些连续的操作,尽可能地减少网络往返次数以及提升整体吞吐量。对于 INSERT、UPDATE 和 DELETE 类型的数据变更命令尤为明显[^3]。 具体来说,开启此功能之后,原本由多条 DML (Data Manipulation Language) 构成的任务会被重组打包成单一事务提交给服务端解析执行,从而大大提高了效率[^4]。 #### 示例代码展示 下面是一个简单的 Java 程序片段用于说明如何利用上述特性完成高效的批量插入操作: ```java try { String sql = "INSERT INTO users(name,email) VALUES(?,?)"; PreparedStatement pstmt = connection.prepareStatement(sql); for(User user : userList){ pstmt.setString(1,user.getName()); pstmt.setString(2,user.getEmail()); pstmt.addBatch(); } int[] resultCounts = pstmt.executeBatch(); // 发送整个批处理指令集 } catch (SQLException e) { throw new RuntimeException(e.getMessage(),e); } ``` 需要注意的是,虽然开启了 `rewriteBatchedStatements=true` 可以显著改善性能表现,但在某些特殊场景下可能会遇到兼容性问题或是不符合预期的行为,因此建议开发者们根据实际情况测试验证后再决定是否采用这一机制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值