sql >> Databasteknik >  >> RDS >> Mysql

MySQL och JDBC med rewriteBatchedStatements=true

med rewriteBatchedStatements=true kommer JDBC att packa så många frågor som möjligt i ett enda nätverkspaket, vilket minskar nätverkskostnaden på detta sätt. Har jag rätt?

Ja. Följande kod

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

kommer att skicka individuella INSERT-satser trots att jag har skapat en batch

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

Men om jag ändrar anslutningssträngen till att inkludera rewriteBatchedStatements=true

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

sedan skickar JDBC en eller flera INSERT-satser med flera rader

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

känner JDBC till värdet som tilldelats max_allowed_packet och gör därför paketet mindre än det definierade värdet för max_allowed_packet ... ?

Ja. Om du aktiverar den allmänna MySQL-loggen och kontrollerar den kommer du att se att MySQL Connector/J inspekterar ett gäng variabler när den ansluter, varav en är max_allowed_packet . Du kan också ställa in ett litet max_allowed_packet värde och verifiera att JDBC delar upp en batch i flera INSERT-satser med flera rader om en enda sådan sats för hela batchen skulle överskrida max_allowed_packet .




  1. Varför behöver vi meddelandeförmedlare som RabbitMQ över en databas som PostgreSQL?

  2. Hur kan jag importera en stor (14 GB) MySQL-dumpfil till en ny MySQL-databas?

  3. MySQL installation

  4. Prestanda överraskningar och antaganden:GROUP BY vs. DISTINCT