我已经阅读了大约hereherehere篇关于使用rewriteBatchedStatements=true的优点的文章

如果我理解正确的话,使用rewriteBatchedStatements=true,JDBC将把尽可能多的查询放入一个网络数据包中,这样可以降低网络开销.我说得对吗?

然后我注意到,MySQL服务器中为max_allowed_packet定义的值可能会导致查询出现问题(服务器上没有执行查询).

所以我的第二个问题是,JDBC是否知道分配给max_allowed_packet的值,从而使数据包小于为max_allowed_packet定义的值,或者开发人员必须考虑这一点?

如果我理解错了,也请告诉我.

推荐答案

使用rewriteBatchedStatements=true,JDBC将尽可能多的查询打包到一个网络数据包中,从而降低网络开销.我说得对吗?

对下面的代码

String myConnectionString =
        "jdbc:mysql://localhost:3307/mydb?" +
        "useUnicode=true&characterEncoding=UTF-8";
try (Connection con = DriverManager.getConnection(myConnectionString, "root", "whatever")) {
    try (PreparedStatement ps = con.prepareStatement("INSERT INTO jdbc (`name`) VALUES (?)")) {
        for (int i = 1; i <= 5; i++) {
            ps.setString(1, String.format(
                    "Line %d: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", 
                    i));
            ps.addBatch();
        }
        ps.executeBatch();
    }
}

即使我已经创建了一个批,也会发送单独的INSERT语句

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')

但是,如果我将连接字符串更改为包含rewriteBatchedStatements=true

String myConnectionString =
        "jdbc:mysql://localhost:3307/mydb?" +
        "useUnicode=true&characterEncoding=UTF-8" +
        "&rewriteBatchedStatements=true";

然后JDBC将发送一个或多个多行INSERT语句

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')

JDBC是否知道分配给max_allowed_数据包的值,从而使数据包小于为max_allowed_数据包定义的值?

对如果您启用MySQL常规日志(log)并判断它,您将看到MySQL Connector/J在连接时判断一组变量,其中一个是max_allowed_packet.您还可以设置一个小的max_allowed_packet值,并验证JDBC是否将一个批拆分为多个多行INSERT语句(如果整个批的单个此类语句将超过max_allowed_packet).

Mysql相关问答推荐

基于多行从表中 Select

子查询是否可以按主查询中的列进行分组?

mysql 获取每个单词的第一个字母

将 GORM 与自定义连接表和外键结合使用

避免多个SQL查询的重构代码

获取每个参数的记录,不重复

如何将多个字符串插入变量

无法从mysql数据库获取数据

MYSQL:范围匹配与周年纪念日

使用另一个表中的值更新一个表中的值

SQL从字典中的键获取值

如何在 MYSQL 中使用多个表进行插值

如何使用 Raw SQl / Laravel 进行累积计数 - Eloquent ORM

在 MySQL 中转换 JSON 数组值

即使我的约束是正确的,如何解决 errno: 150 外键约束形成错误?

MySQL 工作台与 phpMyAdmin

Laravel $q->where() 日期之间

将 mySQL 查询作为 cron 作业(job)运行?

在 PHP/MySQL 中将日期时间存储为 UTC

'LIKE ('%this%' OR '%that%') and something=else' 不起作用