web-dev-qa-db-fra.com

MySQL et JDBC avec rewriteBatchedStatements = true

J'ai lu, ici , ici et ici sur les avantages de l'utilisation de rewriteBatchedStatements=true

Si j'ai bien compris, avec rewriteBatchedStatements=true le JDBC emballera autant de requêtes que possible dans un seul paquet réseau, réduisant ainsi le temps système du réseau. Ai-je raison?

Ensuite, il vient à mon attention que la valeur définie dans le serveur MySQL pour le max_allowed_packet peut provoquer des problèmes avec les requêtes (les requêtes ne sont pas exécutées sur le serveur).

Ma deuxième question est donc la suivante: JDBC connaît-il la valeur attribuée à max_allowed_packet et donc rendre le paquet plus petit que la valeur définie pour max_allowed_packet ou c'est quelque chose que le développeur doit prendre en considération?

Si j'ai mal compris quelque chose, faites-le moi savoir également.

41
dazito

avec rewriteBatchedStatements = true, le JDBC regroupera autant de requêtes que possible dans un seul paquet réseau, réduisant ainsi la surcharge du réseau. Ai-je raison?

Oui. Le code suivant

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

enverra des instructions INSERT individuelles même si j'ai créé un lot

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

Cependant, si je change la chaîne de connexion pour inclure rewriteBatchedStatements=true

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

puis JDBC enverra une ou plusieurs instructions INSERT à plusieurs lignes

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

jDBC connaît-il la valeur affectée à max_allowed_packet et rend-il donc le paquet plus petit que la valeur définie pour max_allowed_packet ...?

Oui. Si vous activez le journal général MySQL et le vérifiez, vous verrez que MySQL Connector/J inspecte un tas de variables lors de la connexion, dont une est max_allowed_packet. Vous pouvez également définir un petit max_allowed_packet valeur et vérifiez que JDBC divise un lot en plusieurs instructions INSERT à plusieurs lignes si une seule telle instruction pour l'ensemble du lot dépasse max_allowed_packet.

60
Gord Thompson