2014-10-10 19 views
28

ho letto in giro, here, here e here sui vantaggi dell'utilizzo di rewriteBatchedStatements=trueMySQL e JDBC con rewriteBatchedStatements = true

se ho capito bene, con rewriteBatchedStatements=true JDBC sarà pacchetto il maggior numero di query come possibile in un singolo pacchetto di rete, riducendo in questo modo il sovraccarico della rete. Ho ragione?

Quindi viene in mente che il valore definito nel server MySQL per il max_allowed_packet potrebbe causare problemi con le query (query non eseguite sul server).

Quindi la mia seconda domanda è, JDBC conosce il valore assegnato a max_allowed_packet e pertanto rende il pacchetto più piccolo del valore definito per max_allowed_packet o è qualcosa che lo sviluppatore deve prendere in considerazione?

Se ho capito qualcosa di sbagliato, per favore fatemelo sapere pure.

+0

Perché il voto negativo? Cura di spiegare? – dazito

risposta

39

con rewriteBatchedStatements = true JDBC impacchetterà quante più query possibile in un singolo pacchetto di rete, riducendo così il sovraccarico della rete. Ho ragione?

Sì. Il seguente codice

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

invierà singole istruzioni INSERT, anche se ho creato un batch

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

Tuttavia, se cambio la stringa di connessione per includere rewriteBatchedStatements=true

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

poi JDBC inviare una o più istruzioni INSERT multi-riga

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

JDBC conosce il valore assegnato a max_allowed_packet e pertanto rende il pacchetto più piccolo del valore definito per max_allowed_packet ...?

Sì. Se abiliti il ​​log generale MySQL e lo controlli, vedrai che MySQL Connector/J ispeziona un gruppo di variabili quando si collega, una delle quali è max_allowed_packet. È inoltre possibile impostare un valore piccolo max_allowed_packet e verificare che JDBC suddivida un batch in più istruzioni INSERT a più righe se una singola dichiarazione di questo tipo per l'intero batch supera max_allowed_packet.

+3

ma c'è un effetto collaterale su ACID: senza riscrivereBatchedState possiamo inserire una parte di righe, ma ora non possiamo inserire nulla anche se c'è una sola chiave duplicata. – auntyellow

+3

Solo una nota a margine: non dovresti chiudere 'con' e' ps' perché verrà chiuso automaticamente dal blocco try-with-resources. – Benjamin

+0

@ Benjamin - Ho aggiornato il codice. Grazie. –

Problemi correlati