MySQL配置项

Lu Lv3

1. rewriteBatchedStatements

功能:

  • 用于优化批量执行语句,将多次执行的相同SQL语句(带不同参数)合并为一条SQL语句,从而减少与数据库的通信次数,提高性能。
  • 常用于批量插入或更新场景。

应用场景:

  • 当你使用 JDBC 的 addBatch()executeBatch() 方法批量执行语句时,驱动会自动优化:
    • 将多条INSERT语句合并为单条多值INSERT
    • 将多条UPDATE语句合并为一个批处理命令(如果语法允许)。

特点:

  • 透明性高:客户端代码无需更改,驱动会自动优化语句。
  • 安全性高:驱动优化后仍然会遵循数据库的事务管理规则。
  • 限制: 仅对批处理操作有效,不支持一次性执行多条任意SQL语句。

示例:

配置方式:

1
2
String url = "jdbc:mysql://localhost:3306/testdb?rewriteBatchedStatements=true";
Connection conn = DriverManager.getConnection(url, user, password);

优化前(发送多条单独的SQL语句):

1
2
INSERT INTO table_name (col1, col2) VALUES ('a1', 'b1');
INSERT INTO table_name (col1, col2) VALUES ('a2', 'b2');

优化后(合并为一条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注入问题,因此需特别注意使用参数化查询。
  • 限制: 不会对批量语句进行优化,语句仍会逐条执行。

示例:

配置方式:

1
2
String url = "jdbc:mysql://localhost:3306/testdb?allowMultiQueries=true";
Connection conn = DriverManager.getConnection(url, user, password);

多条SQL语句执行:

1
2
3
4
Statement stmt = conn.createStatement();
String sql = "INSERT INTO table_name (col1, col2) VALUES ('a1', 'b1'); " +
"UPDATE table_name SET col2 = 'updated' WHERE col1 = 'a1';";
stmt.execute(sql);

3. 区别总结

特性rewriteBatchedStatementsallowMultiQueries
用途优化批量执行相同的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