MySQL配置项

1. rewriteBatchedStatements
功能:
- 用于优化批量执行语句,将多次执行的相同SQL语句(带不同参数)合并为一条SQL语句,从而减少与数据库的通信次数,提高性能。
- 常用于批量插入或更新场景。
应用场景:
- 当你使用 JDBC 的
addBatch()
和executeBatch()
方法批量执行语句时,驱动会自动优化:- 将多条
INSERT
语句合并为单条多值INSERT
。 - 将多条
UPDATE
语句合并为一个批处理命令(如果语法允许)。
- 将多条
特点:
- 透明性高:客户端代码无需更改,驱动会自动优化语句。
- 安全性高:驱动优化后仍然会遵循数据库的事务管理规则。
- 限制: 仅对批处理操作有效,不支持一次性执行多条任意SQL语句。
示例:
配置方式:
1 | String url = "jdbc:mysql://localhost:3306/testdb?rewriteBatchedStatements=true"; |
优化前(发送多条单独的SQL语句):
1 | INSERT INTO table_name (col1, col2) VALUES ('a1', 'b1'); |
优化后(合并为一条SQL语句):
1 | INSERT INTO table_name (col1, col2) VALUES ('a1', 'b1'), ('a2', 'b2'); |
2. allowMultiQueries
功能:
- 允许在单个SQL语句中执行多条独立的SQL命令。
- 常用于需要执行多条不同的SQL语句的场景。
应用场景:
- 当你需要在一次
execute()
或executeQuery()
调用中同时执行多条SQL语句时:- 可以在一条命令中写多条SQL语句,每条语句以
;
分隔。
- 可以在一条命令中写多条SQL语句,每条语句以
- 适合脚本执行或一次性初始化大量SQL。
特点:
- 灵活性高:支持任意SQL语句的组合。
- 潜在安全风险:容易引发SQL注入问题,因此需特别注意使用参数化查询。
- 限制: 不会对批量语句进行优化,语句仍会逐条执行。
示例:
配置方式:
1 | String url = "jdbc:mysql://localhost:3306/testdb?allowMultiQueries=true"; |
多条SQL语句执行:
1 | Statement stmt = conn.createStatement(); |
3. 区别总结
特性 | rewriteBatchedStatements | allowMultiQueries |
---|---|---|
用途 | 优化批量执行相同的SQL语句 | 允许一次执行多条不同SQL语句 |
典型应用场景 | 批量插入、批量更新 | 脚本执行、SQL初始化、多条独立SQL |
语法要求 | 使用addBatch() 和executeBatch() 方法 | 使用; 分隔多条SQL语句 |
性能提升 | 合并多条相同SQL以减少通信次数 | 不提升性能,逐条执行 |
安全性 | 高,自动优化 | 低,易受SQL注入攻击影响 |
限制 | 仅适用于批处理 | 不优化批处理,仅支持多条语句 |
4. 选择建议
- 如果需要批量操作的性能优化,如批量插入或更新数据,推荐使用
rewriteBatchedStatements
。 - 如果需要一次性执行多条独立的SQL语句(如初始化脚本),推荐使用
allowMultiQueries
,但需注意SQL注入风险。
通常情况下,两者并不会同时使用,选择适合具体场景的配置即可。
- Title: MySQL配置项
- Author: Lu
- Created at : 2024-07-18 19:55:52
- Updated at : 2024-07-19 01:05:13
- Link: https://lusy.ink/2024/07/18/MySQL配置项/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments