sql >> Databáze >  >> RDS >> Mysql

MySQL a JDBC s rewriteBatchedStatements=true

s rewriteBatchedStatements=true zabalí JDBC co nejvíce dotazů do jednoho síťového paketu, čímž se sníží režie sítě. Mám pravdu?

Ano. Následující kód

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();
    }
}

odešle jednotlivé příkazy INSERT, i když jsem vytvořil dávku

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

Pokud však změním připojovací řetězec tak, aby zahrnoval rewriteBatchedStatements=true

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

pak JDBC odešle jeden nebo více víceřádkových příkazů INSERT

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

zná JDBC hodnotu přiřazenou k max_allowed_packet, a proto činí paket menší než definovaná hodnota pro max_allowed_packet ...?

Ano. Pokud povolíte obecný protokol MySQL a zkontrolujete jej, uvidíte, že MySQL Connector/J při připojení kontroluje spoustu proměnných, z nichž jedna je max_allowed_packet . Můžete také nastavit malý max_allowed_packet hodnotu a ověřte, že JDBC rozdělí dávku na několik víceřádkových příkazů INSERT, pokud by jeden takový příkaz pro celou dávku překročil max_allowed_packet .




  1. Zřetězit a seskupit více řádků v Oracle

  2. Driver.getConnection se zablokuje pomocí ovladače SQLServer a Java 1.6.0_29

  3. Funkce REMAINDER() v Oracle

  4. Jak analyzovat aktivitu jedné databáze na serveru SQL