복붙노트

[SQL] rewriteBatchedStatements와 MySQL과 JDBC = TRUE

SQL

rewriteBatchedStatements와 MySQL과 JDBC = TRUE

내가 rewriteBatchedStatements를 사용할 때의 장점에 대해 여기와 여기, 여기, 주위 읽어 봤는데 = TRUE

나는 그것이 바로, rewriteBatchedStatements로 = true를 JDBC이 방법을 네트워크 오버 헤드를 낮추는 단일 네트워크 패킷으로 가능한 한 많은 쿼리로 포장됩니다 이해합니다. 암 I 오른쪽?

그런 다음의 max_allowed_packet의 MySQL 서버에 정의 된 값이 쿼리에 문제가 (서버에서 실행되는이 아닌 질의는)이 발생할 수 있음을 내 관심에 온다.

내 두 번째 질문은 그래서, JDBC는의 max_allowed_packet에 할당 된 값을 알고 있고, 따라서 패킷의 max_allowed_packet에 대해 정의 된 값보다 작게 만들거나 개발자가 고려에 걸릴해야한다는 것을입니다합니까?

내가 뭔가 잘못 이해하는 경우에도 알려주세요.

해결법

  1. ==============================

    1.예. 다음 코드

    예. 다음 코드

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

    내가 배치를 만든 경우에도 개별 INSERT 문을 보내드립니다

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

    그러나, 나는 rewriteBatchedStatements을 포함하는 연결 문자열을 변경하는 경우 = TRUE

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

    다음 JDBC는 하나 이상의 다중 행 INSERT 문을 보내드립니다

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

    예. 당신은 MySQL의 일반적인 로그를 활성화하고이를 선택하면 당신은의 max_allowed_packet 중 하나는, 연결할 때 MySQL의 커넥터 / J는 변수의 무리를 검사 것을 볼 수 있습니다. 또한 소형의 max_allowed_packet 값을 설정하고 전체 배치에 대한 하나의 같은 문의 max_allowed_packet을 초과 할 경우 JDBC는 여러 다중 행 INSERT 문으로 배치 분할 확인할 수 있습니다.

  2. from https://stackoverflow.com/questions/26307760/mysql-and-jdbc-with-rewritebatchedstatements-true by cc-by-sa and MIT license