Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL i JDBC z rewriteBatchedStatements=true

z rewriteBatchedStatements=true JDBC spakuje jak najwięcej zapytań w pojedynczym pakiecie sieciowym, zmniejszając w ten sposób obciążenie sieci. Czy mam rację?

Tak. Poniższy 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();
    }
}

wyśle ​​indywidualne wyciągi INSERT, mimo że utworzyłem partię

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

Jeśli jednak zmienię ciąg połączenia, aby zawierał rewriteBatchedStatements=true

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

następnie JDBC wyśle ​​jedno lub więcej wielowierszowych instrukcji INSERT

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

czy JDBC zna wartość przypisaną do max_allowed_packet i dlatego sprawia, że ​​pakiet jest mniejszy niż zdefiniowana wartość dla max_allowed_packet ...?

Tak. Jeśli włączysz ogólny dziennik MySQL i sprawdzisz go, zobaczysz, że MySQL Connector/J sprawdza kilka zmiennych podczas łączenia, z których jedną jest max_allowed_packet . Możesz także ustawić mały max_allowed_packet i sprawdź, czy JDBC dzieli partię na kilka wielowierszowych instrukcji INSERT, jeśli pojedyncza taka instrukcja dla całej partii przekroczyłaby wartość max_allowed_packet .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ściągawka z wydajnością MySQL

  2. Pole liczb całkowitych MySQL jest zwracane jako ciąg znaków w PHP

  3. Dodać 2 godziny do aktualnego czasu w MySQL?

  4. Wykryj, czy wartość jest liczbą w MySQL

  5. Limit rozmiaru importu pliku w PHPMyAdmin