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 중국어 웹사이트의 기타 관련 기사를 참조하세요!