기사 출처: 데이터베이스 포럼 작성자: jackma
JDBC(Java Database Connectivity) API는 Java 프로그래머가 데이터베이스에 액세스할 수 있도록 하는 일련의 인터페이스입니다. 다양한 개발자의 인터페이스가 완전히 동일하지는 않습니다. 저는 수년간 Oracle의 JDBC를 사용한 후 시스템 성능을 보다 잘 활용하고 더 많은 기능을 달성할 수 있는 많은 기술을 축적했습니다.
1. 클라이언트 소프트웨어 개발에 Thin 드라이버 사용
Java 소프트웨어 개발 측면에서 오라클의 데이터베이스는 네 가지 유형의 드라이버를 제공합니다. 두 개는 애플리케이션 소프트웨어, 애플릿, 서블릿과 같은 클라이언트 소프트웨어용이고 나머지 두 개는 데이터베이스의 Java 저장 프로시저와 같은 서버측 소프트웨어용입니다. 클라이언트 측 소프트웨어 개발에서는 OCI 드라이버 또는 Thin 드라이버를 선택할 수 있습니다. OCI 드라이버는 JNI(Java Localization Interface)를 활용하여 Oracle 클라이언트 소프트웨어를 통해 데이터베이스와 통신합니다. Thin 드라이버는 데이터베이스와 직접 통신하는 순수 Java 드라이버입니다. 최대 성능을 위해 Oracle은 클라이언트 소프트웨어 개발에 OCI 드라이버를 사용할 것을 권장하며 이는 올바른 것 같습니다. 하지만 Thin 드라이버를 사용하는 것이 좋습니다. 왜냐하면 많은 테스트를 통해 Thin 드라이버의 성능이 일반적인 상황에서 OCI 드라이버의 성능을 능가하는 것으로 나타났기 때문입니다.
2. 시스템 성능 개선을 위해 자동 제출 기능을 꺼주세요.
데이터베이스에 대한 연결을 처음 설정할 때 연결은 기본적으로 자동 커밋 모드입니다. 더 나은 성능을 위해 아래와 같이 Boolean false 매개 변수를 사용하여 Connection 클래스의 setAutoCommit() 메서드를 호출하여 자동 커밋 기능을 끌 수 있습니다.
conn.setAutoCommit(false);
자동 커밋 기능이 꺼지면 Connection 클래스의 commit() 및 Rollback() 메서드를 호출하여 트랜잭션을 수동으로 관리해야 한다는 점은 주목할 가치가 있습니다.
3. 동적 SQL 또는 시간 제한 명령에서 명령문 개체를 사용합니다.
SQL 명령을 실행할 때 두 가지 옵션이 있습니다. 즉, preparedStatement 객체를 사용할 수도 있고 아니면 State 객체를 사용할 수도 있습니다. 동일한 SQL 명령을 몇 번이나 사용하더라도 ReadyStatement는 이를 한 번만 구문 분석하고 컴파일합니다. Statement 개체를 사용하면 SQL 명령이 실행될 때마다 구문 분석되고 컴파일됩니다. 이로 인해 ReadyStatement 개체를 사용하는 것이 State 개체를 사용하는 것보다 빠르다고 생각할 수도 있습니다. 그러나 제가 수행한 테스트에 따르면 클라이언트 소프트웨어에서는 그렇지 않습니다. 따라서 시간 제한이 있는 SQL 작업에서는 SQL 명령이 일괄적으로 처리되지 않는 한 State 개체 사용을 고려해야 합니다.
또한, 명령문 개체를 사용하면 문자열을 연결하여 유효한 SQL 명령을 작성할 수 있으므로 동적 SQL 명령을 더 쉽게 작성할 수 있습니다. 그러므로 나는 Statement 객체가 동적 SQL 명령의 생성과 실행을 더 쉽게 만들어 줄 수 있다고 믿습니다.
4. 도우미 함수를 사용하여 동적 SQL 명령 형식 지정
State 개체를 사용하여 실행되는 동적 SQL 명령을 생성할 때 몇 가지 형식 문제를 처리해야 합니다. 예를 들어, O'Reilly라는 이름을 테이블에 삽입하는 SQL 명령을 생성하려면 O'Reilly의 "'" 기호를 두 개의 연속된 "''" 기호로 바꿔야 합니다. 가장 좋은 방법은 대체 작업을 수행하는 도우미 메서드를 만든 다음, 연결 문자열을 수식을 사용하여 SQL 명령으로 표현할 때 생성된 도우미 메서드를 사용하는 것입니다. 마찬가지로 도우미 메서드가 Date 값을 받아들이도록 한 다음 Oracle의 to_date() 함수를 기반으로 문자열 표현식을 출력하도록 할 수 있습니다.
5. 데이터베이스의 전반적인 효율성을 향상시키기 위해 ReadyStatement 개체를 사용하십시오.
SQL 명령을 실행하기 위해 preparedStatement 객체를 사용할 때 명령은 데이터베이스에 의해 구문 분석 및 컴파일된 후 명령 버퍼에 배치됩니다. 그러면 동일한 ReadyStatement 객체가 실행될 때마다 다시 구문 분석되지만 다시 컴파일되지는 않습니다. 미리 컴파일된 명령은 버퍼에 있으며 재사용할 수 있습니다. 사용자 수가 많은 엔터프라이즈급 애플리케이션에서는 동일한 SQL 명령이 반복적으로 실행되는 경우가 많습니다. ReadyStatement 객체를 사용하면 컴파일 횟수가 줄어들어 데이터베이스의 전반적인 성능이 향상될 수 있습니다. 클라이언트 측에서 preparedStatement 작업을 생성, 준비 및 실행하는 데 SQL 문 작업보다 시간이 오래 걸리지 않는 한 동적 SQL 명령을 제외한 모든 경우에 ReadyStatement 개체를 사용하는 것이 좋습니다.
6. 반복되는 삽입이나 업데이트 작업의 일괄처리에 preparedStatement 객체를 활용하세요 <br /> <br /> 삽입과 업데이트 작업을 일괄적으로 처리하면 소요시간을 대폭 줄일 수 있습니다. Oracle에서 제공하는 Statement 및 CallableStatement는 실제로 일괄 처리를 지원하지 않습니다. 오직 preparedStatement 객체만이 실제로 일괄 처리를 지원합니다. addBatch() 및 excuteBatch() 메소드를 사용하여 표준 JDBC 일괄 처리를 선택하거나, preparedStatement 객체의 setExecuteBatch() 메소드 및 표준 excuteUpdate() 메소드를 활용하여 더 빠른 Oracle 독점 메소드를 선택할 수 있습니다. Oracle의 독점 일괄 처리 메커니즘을 사용하려면 아래와 같이 setExecuteBatch()를 호출할 수 있습니다.
준비된 문 pstmt3D null;
노력하다 {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}