>  기사  >  Java  >  여러 반복에 대해 ReadyStatement 재사용을 최적화하는 방법은 무엇입니까?

여러 반복에 대해 ReadyStatement 재사용을 최적화하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-27 16:33:29603검색

 How to Optimize PreparedStatement Reusage for Multiple Iterations?

PreparedStatement를 여러 번 반복하여 재사용

연결 풀 없이 단일 공통 연결을 사용하는 경우 다음 질문이 발생할 수 있습니다. 준비된 문의 이점을 유지하면서 각 DML 또는 SQL 작업에 대해 새 preparedStatement 인스턴스를 생성하는 것이 더 효율적인지 여부를 결정합니다.

대신:

<code class="java">for (int i=0; i<1000; i++) {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
    preparedStatement.close();
}

다음을 고려할 수 있습니다.

<code class="java">PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
    preparedStatement.clearParameters();
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
}
preparedStatement.close();

두 번째 접근 방식은 약간의 효율성 향상을 제공하지만 우수한 솔루션은 일괄 실행에 있습니다.

<code class="java">public void executeBatch(List<Entity> entities) throws SQLException { 
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL);
    ) {
        for (Entity entity : entities) {
            statement.setObject(1, entity.getSomeProperty());
            // ...

            statement.addBatch();
        }

        statement.executeBatch();
    }
}</code>

이 접근 방식은 JDBC 드라이버가 제공하는 일괄 처리 기능을 활용하여 드라이버 수를 줄입니다. 데이터베이스를 왕복하여 효율성을 높입니다. 1000개 항목마다 실행하는 등 배치 크기 제한을 정의하여 추가로 최적화할 수 있습니다.

<code class="java">public void executeBatch(List<Entity> entities) throws SQLException { 
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL);
    ) {
        int i = 0;

        for (Entity entity : entities) {
            statement.setObject(1, entity.getSomeProperty());
            // ...

            statement.addBatch();
            i++;

            if (i % 1000 == 0 || i == entities.size()) {
                statement.executeBatch(); // Execute every 1000 items.
            }
        }
    }
}</code>

멀티 스레드 환경의 경우 최단 시간 내에 연결과 명령문을 모두 획득하고 닫아 스레드 안전성을 보장할 수 있습니다. 위의 코드 조각에서 볼 수 있듯이 try-with-resources 문을 사용하여 가능한 범위입니다. 트랜잭션 배치의 경우 자동 커밋을 비활성화하고 모든 배치가 완료된 후에만 트랜잭션을 커밋합니다.

위 내용은 여러 반복에 대해 ReadyStatement 재사용을 최적화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.