source

rewriteBatchedStatements=true를 사용하는 MySQL 및 JDBC

nicesource 2022. 12. 4. 22:31
반응형

rewriteBatchedStatements=true를 사용하는 MySQL 및 JDBC

여기 저기, 여기, 여기, 여기, 그리고 여기 저기를 돌아다니면서rewriteBatchedStatements=true

제가 제대로 이해했다면rewriteBatchedStatements=trueJDBC는 가능한 한 많은 쿼리를 단일 네트워크 패킷으로 압축하여 네트워크 오버헤드를 낮춥니다.내 말이 맞니?

그 후 MySQL 서버에 정의된 값은max_allowed_packet는 쿼리에 문제를 일으킬 수 있습니다(서버에서 실행되지 않는 패킷).

그래서 두 번째 질문은 JDBC가 이 값을 인식하고 있는지 여부입니다.max_allowed_packet따라서 패킷은 정의된 값보다 작습니다.max_allowed_packet아니면 개발자가 고려해야 할 사항입니까?

제가 잘못 이해한 부분이 있으면 저에게도 알려주세요.

rewriteBatchedStatements=true를 사용하면 JDBC는 가능한 한 많은 쿼리를 단일 네트워크 패킷으로 패킹하여 네트워크 오버헤드를 줄입니다.내 말이 맞니?

네. 다음 코드

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 ...')

JDBC는 max_allowed_packet에 할당된 값을 인식하고 있기 때문에 정의된 max_allowed_packet 값보다 패킷을 작게 할 수 있습니까?

네. MySQL 일반 로그를 활성화하고 체크하면 MySQL Connector/J가 연결할 때 여러 변수를 검사하는 것을 볼 수 있습니다. 그 중 하나는 다음과 같습니다.max_allowed_packet. 스몰을 설정할 수도 있습니다.max_allowed_packetJDBC가 배치 전체를 대상으로 한 단일 문장이 다음 값을 초과할 경우 배지를 여러 행의 INSERT 문장으로 분할하는지 확인합니다.max_allowed_packet.

언급URL : https://stackoverflow.com/questions/26307760/mysql-and-jdbc-with-rewritebatchedstatements-true

반응형