MySQL und JDBC mit rewriteBatchedStatements=true

Lesezeit: 3 Minuten

MySQL und JDBC mit rewriteBatchedStatementstrue
dazito

Ich habe herumgelesen, Hier, Hier und Hier über die Vorteile der Verwendung rewriteBatchedStatements=true

Wenn ich es richtig verstanden habe, mit rewriteBatchedStatements=true das JDBC wird Pack so viele Abfragen wie möglich in einem einzigen Netzwerkpaket, wodurch der Netzwerk-Overhead gesenkt wird. Habe ich recht?

Dann fällt mir auf, dass der im MySQL-Server definierte Wert für die max_allowed_packet kann Probleme mit den Abfragen verursachen (Abfragen werden nicht auf dem Server ausgeführt).

Meine zweite Frage ist also, ob JDBC den zugewiesenen Wert kennt max_allowed_packet und machen das Paket daher kleiner als der definierte Wert für max_allowed_packet oder das ist etwas, was der Entwickler berücksichtigen muss?

Falls ich etwas falsch verstanden habe, lasst es mich bitte auch wissen.

  • Warum die Ablehnung? Willst du es erklären?

    – dazito

    10. Oktober 14 um 20:45 Uhr

  • hängen rewriteBatchedStatements und die Eigenschaft hibernate.jdbc.batch_size zusammen? Ich gehe davon aus, dass die Eigenschaft batch_size bestimmt, wie viele Werte in einer Einfügung angehängt werden. Bitte klären Sie!

    – Dhruv Bansal

    14. November 18 um 13:09 Uhr

MySQL und JDBC mit rewriteBatchedStatementstrue
Gord Thompson

mit rewriteBatchedStatements=true packt JDBC so viele Abfragen wie möglich in ein einziges Netzwerkpaket und senkt so den Netzwerk-Overhead. Habe ich recht?

Ja. Der folgende Code

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

sendet einzelne INSERT-Anweisungen, obwohl ich einen Stapel erstellt habe

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

Wenn ich jedoch die Verbindungszeichenfolge ändere, um sie einzuschließen rewriteBatchedStatements=true

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

dann sendet JDBC eine oder mehrere mehrzeilige INSERT-Anweisungen

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

kennt JDBC den max_allowed_packet zugewiesenen Wert und macht das Paket daher kleiner als der definierte Wert für max_allowed_packet … ?

Ja. Wenn Sie das allgemeine MySQL-Protokoll aktivieren und überprüfen, werden Sie feststellen, dass MySQL Connector/J eine Reihe von Variablen überprüft, wenn es eine Verbindung herstellt, darunter eine max_allowed_packet. Sie können auch eine kleine einstellen max_allowed_packet -Wert und vergewissern Sie sich, dass JDBC einen Stapel in mehrere mehrzeilige INSERT-Anweisungen aufteilt, wenn eine einzelne solche Anweisung für den gesamten Stapel die Grenze überschreiten würde max_allowed_packet.

  • aber es gibt einen Nebeneffekt bei ACID: Ohne rewriteBatchedStatements können wir einen Teil der Zeilen einfügen, aber jetzt können wir nichts einfügen, selbst wenn es nur einen doppelten Schlüssel gibt.

    – tantegelb

    31. Dezember 2014 um 14:47 Uhr

  • Nur eine Randnotiz: Sie sollten nicht schließen con und ps da es automatisch durch den try-with-resources-Block geschlossen wird.

    – Benjamin

    28. April 16 um 12:42 Uhr

  • @GordThompson irgendeine Idee, warum rewriteBatchedStatements für mysql standardmäßig auf false gesetzt ist? Gibt es irgendwelche Kosten/Nachteile bei der Aktivierung?

    – Suren Aznauryan

    14. November 18 um 17:26 Uhr

  • Bei so etwas ist es besser, eine Opt-in-Philosophie zu haben, als eine, die Ihnen aufgezwungen wird. Aber zu der Frage, es könnte (wie alle Codebasen) Fehler enthalten (hoffentlich nicht). google.com/…

    – GranadaCoder

    31. März 21 um 17:09 Uhr

.

757870cookie-checkMySQL und JDBC mit rewriteBatchedStatements=true

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy