JDBC(Java Database Connectivity) API는 Java 프로그래머가 데이터베이스에 액세스할 수 있도록 하는 일련의 인터페이스입니다. 다양한 개발자의 인터페이스가 완전히 동일하지는 않습니다. 저는 수년간 Oracle의 JDBC를 사용한 후 시스템 성능을 더욱 잘 활용하고 더 많은 기능을 달성할 수 있는 많은 기술을 축적했습니다.
1. 클라이언트 소프트웨어 개발에 Thin 드라이버 사용
Java 소프트웨어 개발 측면에서 오라클 데이터베이스는 4가지 유형의 드라이버를 제공하며, 그 중 2개는 애플리케이션 소프트웨어, 애플릿, 서블릿과 같은 클라이언트 소프트웨어에 사용되고 나머지 2개는 애플리케이션에 사용됩니다. 애플리케이션 소프트웨어, 애플릿, 서블릿과 같은 클라이언트 소프트웨어. 데이터베이스의 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 명령을 실행할 때 두 가지 옵션이 있습니다. 준비된 상태 개체 또는 명령문 개체를 사용할 수 있습니다. 동일한 SQL 명령을 몇 번이나 사용하더라도 ReadyStatement는 이를 한 번만 구문 분석하고 컴파일합니다. Statement 개체를 사용하면 SQL 명령이 실행될 때마다 구문 분석되고 컴파일됩니다. 이로 인해 ReadyStatement 개체를 사용하는 것이 State 개체를 사용하는 것보다 빠르다고 생각할 수도 있습니다. 그러나 제가 수행한 테스트에 따르면 클라이언트 소프트웨어에서는 그렇지 않습니다. 따라서 시간 제한이 있는 SQL 작업에서는 SQL 명령이 일괄적으로 처리되지 않는 한 State 개체 사용을 고려해야 합니다.
또한, 명령문 개체를 사용하면 문자열을 연결하여 유효한 SQL 명령을 작성할 수 있으므로 동적 SQL 명령을 더 쉽게 작성할 수 있습니다. 그러므로 나는 Statement 객체가 동적 SQL 명령의 생성과 실행을 더 쉽게 만들어 줄 수 있다고 믿습니다.
4. 도우미 함수를 사용하여 동적 SQL 명령 형식을 지정합니다.
명령문 개체를 사용하여 실행되는 동적 SQL 명령을 생성할 때 몇 가지 형식 지정 문제를 처리해야 합니다. 예를 들어, O'Reilly라는 이름을 테이블에 삽입하는 SQL 명령을 생성하려면 O'Reilly의 "'" 기호를 두 개의 연속된 "''" 기호로 바꿔야 합니다. 이러한 작업을 수행하는 가장 좋은 방법은 대체 작업을 수행하는 도우미 메서드를 만든 다음 연결 문자열을 수식을 사용하여 SQL 명령으로 표현할 때 생성된 도우미 메서드를 사용하는 것입니다. 마찬가지로 도우미 메서드가 Date 값을 받아들이도록 한 다음 Oracle의 to_date() 함수를 기반으로 문자열 표현식을 출력하도록 할 수 있습니다.
5. 데이터베이스의 전반적인 효율성을 향상시키기 위해 preparedStatement 개체를 사용합니다.
SQL 명령을 실행하기 위해 SQL 명령을 실행하는 경우 해당 명령은 데이터베이스에 의해 구문 분석 및 컴파일된 후 명령 버퍼에 배치됩니다. 그러면 동일한 ReadyStatement 객체가 실행될 때마다 다시 구문 분석되지만 다시 컴파일되지는 않습니다. 미리 컴파일된 명령은 버퍼에 있으며 재사용할 수 있습니다. 사용자 수가 많은 엔터프라이즈급 애플리케이션에서는 동일한 SQL 명령이 반복적으로 실행되는 경우가 많습니다. ReadyStatement 객체를 사용하면 컴파일 횟수가 줄어들어 데이터베이스의 전반적인 성능이 향상될 수 있습니다. 클라이언트 측에서 preparedStatement 작업을 생성, 준비 및 실행하는 데 SQL 문 작업보다 시간이 오래 걸리지 않는 한 동적 SQL 명령을 제외한 모든 경우에 ReadyStatement 개체를 사용하는 것이 좋습니다.
6. preparedStatement 객체를 사용하여 반복되는 삽입 또는 업데이트 작업을 일괄 처리합니다.
삽입 및 업데이트 작업을 일괄 처리하면 필요한 시간을 크게 줄일 수 있습니다. Oracle에서 제공하는 Statement 및 CallableStatement는 실제로 일괄 처리를 지원하지 않습니다. 오직 preparedStatement 객체만이 실제로 일괄 처리를 지원합니다. addBatch() 및 excuteBatch() 메소드를 사용하여 표준 JDBC 일괄 처리를 선택하거나, preparedStatement 객체의 setExecuteBatch() 메소드 및 표준 excuteUpdate() 메소드를 활용하여 더 빠른 Oracle 독점 메소드를 선택할 수 있습니다. Oracle의 고유한 일괄 처리 메커니즘을 사용하려면 다음과 같이 setExecuteBatch()를 호출할 수 있습니다.
ReadyStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate()
}
setExecuteBatch를 호출할 때 지정된 값입니다. ()는 상한값입니다. 이 값에 도달하면 SQL 명령 실행이 자동으로 트리거되고 표준 ExecuteUpdate() 메서드가 일괄 처리로 데이터베이스에 전송됩니다. ReadyStatement 클래스의 sendBatch() 메서드를 호출하여 언제든지 일괄 작업을 전송할 수 있습니다.
7. Oracle 로케이터 메소드를 사용하여 LOB(대형 개체)를 삽입하고 업데이트합니다.
Oracle의 preparedStatement 클래스는 BLOB 및 CLOB와 같은 대형 개체 처리를 완전히 지원하지 않습니다. 특히 Thin 드라이버는 setObject()를 사용한 설정을 지원하지 않습니다. BLOB 값은 setCharacterStream() 메서드를 사용하여 CLOB 값을 설정하는 것을 지원하지 않습니다. 로케이터 자체의 메소드만 데이터베이스에서 LOB 유형 값을 얻을 수 있습니다. ReadyStatement 객체를 사용하여 LOB를 삽입하거나 업데이트할 수 있지만 LOB 값을 가져오려면 위치 지정자를 사용해야 합니다. 이 두 가지 문제로 인해 LOB 값을 삽입, 업데이트 또는 가져오는 데 로케이터 방법을 사용하는 것이 좋습니다.
8. SQL92 구문을 사용하여 저장 프로시저를 호출할
때 SQL92 또는 Oracle PL/SQL을 사용할 수 있습니다. Oracle PL/SQL을 사용하면 실질적인 이점이 없으며 애플리케이션을 유지 관리하는 개발자에게 문제가 발생합니다. 문제가 발생하므로 저장 프로시저를 호출할 때는 SQL92를 사용하는 것이 좋습니다.
9. 객체 SQL을 사용하여 객체 스키마를 데이터베이스로 전송합니다.
Oracle의 데이터베이스는 객체 지향 데이터베이스로 사용될 수 있으므로 애플리케이션의 객체 지향 스키마를 데이터베이스로 전송하는 것을 고려할 수 있습니다. 현재 접근 방식은 위장된 데이터베이스 객체로 Java Bean을 생성하고 해당 속성을 관계형 테이블에 매핑한 다음 이러한 Bean에 메서드를 추가하는 것입니다. Java에서는 문제가 없지만 작업이 데이터베이스 외부에서 수행되기 때문에 데이터베이스에 액세스하는 다른 응용 소프트웨어는 개체 모델을 활용할 수 없습니다. Oracle의 객체 지향 기술을 활용하면 새로운 데이터베이스 객체 유형을 생성하여 데이터베이스에서 해당 데이터와 작업을 시뮬레이션한 다음 JPublisher와 같은 도구를 사용하여 고유한 Java Bean 클래스를 생성할 수 있습니다. 이 방법을 사용하면 Java 응용 프로그램은 응용 프로그램 소프트웨어의 개체 모델을 사용할 수 있을 뿐만 아니라 응용 프로그램의 데이터와 작업을 공유해야 하는 다른 응용 프로그램 소프트웨어도 응용 프로그램 소프트웨어의 개체 모델을 사용할 수 있습니다.
10. SQL을 사용하여 데이터베이스 작업 완료
제가 소개하고 싶은 가장 중요한 경험은 Java와 같은 절차적 프로그래밍 언어를 사용하는 대신 SQL의 집합 지향 접근 방식을 최대한 활용하여 데이터베이스 처리 요구 사항을 해결하는 것입니다.
프로그래머가 한 테이블에서 많은 행을 조회한다면 결과의 각 행은 다른 테이블의 데이터를 조회하게 됩니다. 마지막으로 프로그래머는 첫 번째 테이블의 데이터를 일괄적으로 업데이트하기 위해 별도의 UPDATE 명령을 생성했습니다. 이와 유사한 작업은 set 절의 다중 열 하위 쿼리를 사용하여 UPDATE 명령에서 수행할 수 있습니다. 단일 SQL 명령으로 작업을 완료할 수 있는데 왜 인터넷을 통해 데이터 흐름을 허용합니까? 나는 사용자들이 SQL의 성능을 극대화하는 방법을 주의 깊게 배울 것을 권장합니다.
작성자: picva 출처: CCID 기술 커뮤니티