sql >> Database teknologi >  >> RDS >> Mysql

MySQL og JDBC med rewriteBatchedStatements=true

med rewriteBatchedStatements=true vil JDBC pakke så mange forespørgsler som muligt i en enkelt netværkspakke, hvilket på denne måde sænker netværksomkostningerne. Har jeg ret?

Ja. Følgende kode

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

vil sende individuelle INSERT-udsagn, selvom jeg har oprettet en batch

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

Men hvis jeg ændrer forbindelsesstrengen til at inkludere rewriteBatchedStatements=true

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

så sender JDBC en eller flere INSERT-sætninger med flere rækker

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

kender JDBC den værdi, der er tildelt max_allowed_packet og gør derfor pakken mindre end den definerede værdi for max_allowed_packet ... ?

Ja. Hvis du aktiverer den generelle MySQL-log og tjekker den, vil du se, at MySQL Connector/J inspicerer en masse variabler, når den opretter forbindelse, hvoraf den ene er max_allowed_packet . Du kan også indstille en lille max_allowed_packet værdi og kontroller, at JDBC opdeler en batch i flere INSERT-sætninger med flere rækker, hvis en enkelt sådan sætning for hele batchen ville overstige max_allowed_packet .




  1. Jeg kan ikke bruge mysql_* funktioner efter opgradering af PHP

  2. rails + MySQL på OSX:Bibliotek ikke indlæst:libmysqlclient.18.dylib

  3. Sådan fungerer COUNT() i SQL Server

  4. Sådan deaktiveres en fremmednøglebegrænsning i SQL Server (T-SQL-eksempler)