FAQ

모두 열기 모두 닫기
  • 19c의 새로운 특징

    업데이트: 2022년 1월 5일

    이 문서에는 Oracle JDBC 드라이버에 관해 자주 묻는 질문과 그에 대한 답변이 수록되어 있습니다. 이 FAQ는 특정 기술 관련 질문만 다루며 알려진 문제뿐만 아니라 일반적인 고객 문의 사항에 대한 해결 방법을 문서화하는 데 사용됩니다. 자세한 내용은 JDBC Reference Guide(JDBC 참조 설명서)Javadoc for JDBC(JDBC용 Javadoc)를 참조하십시오.

    아래 섹션에서는 19c의 주요 JDBC 기능을 설명합니다. 자세한 내용은 Revisiting the Performance & Scalability of Java Applications that use RDBMSes(RDBMS를 사용하는 Java 애플리케이션의 성능 및 확장성 재검토)를 참조하십시오.

    • 최신 Java 표준: JDK 11, JDK 10, JDK 9, JDK8을 지원하고 JDBC 드라이버(ojdbc10.jar(19c만 해당) 및 ojdbc8.jar)와 Universal Connection Pool(ucp.jar)을 통해 JDBC 4.3 및 JDBC 4.2와 호환됩니다.

    • 접속: 더욱 손쉬운 TCPS 연결 및 연결 속성 전달을(19c 한정) 위한 Easy Connect Plus, 연결 속성 설정을 위한 새로운 ojdbc.properties 파일, 다양한 TNS_ADMIN 설정 방식, 서버의 도메인 이름(DN) 인증을 연결 속성으로 설정, 새로운 전자 지갑 속성 지원(my_wallet_directory)
    • 성능: Oracle Database(21c 한정)로의 데이터 스트리밍을 위한 Reactive Streams Ingest(RSI), Traffic Director 모드(CMAN-TDM)의 Oracle 연결 관리자(CMAN)
    • 고가용성: Transparent Application Continuity(TAC), DRCP에서 AC 지원, 구체적인 Java 클래스로 구체화된 레거시 Oracle JDBC 유형에 대한 AC 지원
    • 확장성: Oracle RAC 데이터 인접성, 중간 계층용 샤드 라우팅 API
    • 보안: Automatic provider resolution for OraclePKIProvider용 자동 제공자 변환, Key Store Service(KSS) 지원, HTTPS 프록시 지원
    • 데이터 유형: PL/SQL 연관 배열에 대한 액세스, IN 바인드 매개변수로써의 Oracle REF CURSOR, JSON 데이터 유형 검증
  • Java 개발자를 위한 Oracle Database Cloud Service 관련 문서가 있습니까?

    JDBC 드라이버 및/또는 UCP를 사용하는 Java 개발자가 클라우드 데이터베이스 서비스에 연결할 때 참고할 상세 지침은 JDBC with DB Cloud 페이지에서 찾을 수 있습니다.

JDBC 일반 정보

  • JDBC란?

    JDBC(Java Database Connectivity) API는 Java 프로그래밍 언어와 폭넓은 유형의 데이터베이스(SQL 데이터베이스 및 스프레드시트나 플랫 파일을 비롯한 테이블 형식 데이터 소스)를 데이터베이스 독립적(database-independent)으로 연결해주는 산업 표준입니다. JDBC API는 SQL 기반 데이터베이스 액세스를 위한 호출 레벨 API를 제공합니다.

    JDBC 기술은 엔터프라이즈 데이터에 액세스해야 하는 애플리케이션에 Java 프로그래밍 언어를 사용하여 "Write Once, Run Anywhere(한 번 작성하여 어디서든 실행하기)" 특성을 적용할 수 있습니다. JDBC 기술 지원 드라이버를 사용하면 이기종 환경에서도 모든 기업 데이터를 연결할 수 있습니다.

    —JDK 11의 다양한 JDBC 사양(4.3, 4.2, 4.2 등)에 대해 요약된 내용은 java.sql을 참조하십시오.

    —JDBC의 전체 사양은 jcp.org를 참조하십시오.

  • JDBC에 대한 자세한 정보는 어디에서 확인할 수 있습니까?

    Oracle JDBC 드라이버 페이지부터 둘러보고 JDBC 개발자 가이드JDBC Github에서 추가 정보를 얻으실 수 있습니다.

    JDBC 관련 서적도 많이 있습니다. JDBC API Tutorial and Reference, Third Edition(JDBC API 자습서 및 참고 자료, 3판)부터 읽어보셔도 좋습니다.

  • Java에 대한 자세한 정보는 어디에서 확인할 수 있습니까?

    오라클의 Java 사이트에서 시작하시는 것이 좋습니다.

    Java 관련 도서도 많이 있습니다. 그중 인기 있는 몇 가지를 소개해드립니다.

릴리스 관련 질문

  • 지원되는 JDBC 드라이버 버전은 무엇입니까?

    아래 표에서 지원되는 JDBC 드라이버 버전을 확인하실 수 있습니다. 이 표의 정보는 사용자의 편의를 위해 요약되어 제공됩니다. 자세한 내용 및 업데이트 관련 사항은 Lifetime Support Policy(평생 제품 지원 정책)의 4페이지를 참조하시길 바랍니다.

    릴리스 GA 날짜 Premier Support 만료 Extended Support 만료 Sustaining Support 만료
    21c(혁신 릴리스) 2021년 8월 2024년 4월 사용 불가능 무기한
    19c(장기 릴리스) 2019년 4월 2024년 4월 2027년 4월 무기한
    18c 2018년 7월 2021년 7월 사용 불가능 무기한
    12.2 2017년 3월 2020년 11월 30일(12.2.0.1에 대한 제한된 오류 수정 기간 2020년 12월 1일 – 2022년 3월 31일) 사용 불가능 무기한
    EE 12.1 2013년 6월 2018년 7월 2022년 7월 무기한
  • JDBC 및 RDBMS 상호 운용성 매트릭스 또는 증명 매트릭스는 무엇입니까?

    지원되는 Oracle 데이터베이스 버전의 JDBC 드라이버 상호 운용성 매트릭스가 포함된 테이블을 참조하십시오. 드라이버의 최신 기능을 활용하려면 항상 JDBC 드라이버 버전을 Oracle 데이터베이스 버전과 같거나 그 이상으로 유지하는 것이 좋습니다.

    상호 운용성 매트릭스 데이터베이스 21.1 데이터베이스 19.x 데이터베이스 18.3 데이터베이스 12.2 및 12.1
    JDBC 21.x
    JDBC 19.x
    JDBC 18.x
    JDBC 12.2 and 12.1
  • Oracle JDBC 릴리스에 대응하는 JDK 버전은 무엇입니까?

    Oracle JDBC 드라이버는 새로 릴리스 될 때마다 최신 JDK 버전과 호환됩니다. JDBC 드라이버 버전 중 일부는 여러 JDK 버전을 지원합니다. 아래 테이블을 참고하여 사용하려는 JDK 버전에 적합한 JDBC 드라이버를 선택하십시오.

    Oracle Database 버전 릴리스별 JDBC Jar 파일
    21.x JDK11 및 JDK17에는 ojdbc11.jar
    JDK8 및 JDK11에는 ojdbc8.jar
    19.x JDK11에는 ojdbc10.jar
    JDK8, JDK11에는 ojdbc8.jar
    18.x JDK8 및 JDK11에는 ojdbc8.jar
    12.2 또는 12cR2 JDK 8에는 ojdbc8.jar
    12.1 또는 12cR1 JDK 7 및 JDK 8에는 ojdbc7.jar
    JDK 6에는 ojdbc6.jar
    11.2 또는 11gR2 JDK 6, JDK 7 및 JDK 8에는 ojdbc6.jar
    (참고: JDK7와 JDK8은 11.2.0.3과 11.2.0.4에서만 지원됩니다.)
    JDK 5에는 ojdbc5.jar
  • Oracle JDBC 릴리스에 대응하는 JDK 사양은 무엇입니까?

    다음 테이블에는 Oracle JDBC 드라이버와 해당 릴리스에서 지원하는 JDBC 사양이 포함되어 있습니다.

    Oracle Database 버전 JDBC 사양 준수
    21.1 ojdbc8.jar에는 JDBC 4.3
    ojdbc8.jar에는 JDBC 4.2
    19.x ojdbc10.jar에는 JDBC 4.3
    ojdbc8.jar에는 JDBC 4.2
    18.3 ojdbc8.jar에는 JDBC 4.2
    12.2 또는 12cR2 ojdbc8.jar에는 JDBC 4.2
    12.1 또는 12cR1 ojdbc7.jar에는 JDBC 4.1
    ojdbc6.jar에는 JDBC 4.0
    11.2 또는 11gR2 ojdbc6.jar에는 JDBC 4.0
    ojdbc5.jar에는 JDBC 3.0
  • JDK11과 함께 사용 시 권장하는 19.x JDBC 드라이버는 무엇입니까?     

    19.x 버전에는
    (a) ojdbc8.jar(JDK8(JDBC 4.2)로 컴파일되어 JDK9, JDK11과 함께 사용 가능) 및
    (b) ojdbc10.jar(JDK10(JDBC 4.3)으로 컴파일되어 JDK11과 함께 사용 가능)이 있습니다.
    JDK11을 사용하는 경우, 4.3 기능을 모두 Oracle 확장으로 갖춘 ojdbc8.jar를 선택하는 것이 현명합니다. 표준 Java SE를 통해 사용할 수 있는 JDBC 4.3 기능이 필요한 경우에만 ojdbc10.jar를 사용할 수 있습니다.
    예:
    ojdbc8.jar:
    Connection conn = DriverManager.getConnection(. . .);    // conn.beginRequest(); beginRequest가 Java 8에 없으므로 실패  ((OracleConnection)conn).beginRequest(); // beginRequest가 Oracle 확장으로 제공되므로 성공

    ojdbc10.jar:
    Connection conn = DriverManager.getConnection(. . .);  conn.beginRequest(); // beginRequest가 Java 10에 있으므로 성공        ((OracleConnection)conn).beginRequest(); // OracleConnection이 JDBC 4.3(Java 10에서)을 지원하고 beginRequest가 JDBC 4.3에 포함되어 있으므로 성공
  • 위 테이블에 없는 JDBC 버전은 어떻습니까?

    위 테이블에 없는 경우, 지원 채널에 문의하여 이전 버전에 대한 지원 계약이 유효한지 확인하십시오.

  • JDBC jar 파일은 어디에서 구할 수 있습니까?

    필요한 JDBC jar 및 동반 jar(orai18n.jar, oraclepki.jar, osdt_core.jar, osdt_cert.jar 등)는 Oracle Technology Network JDBC 다운로드 페이지에서 다운로드하십시오.

  • 19.x JDBC 드라이버 다운로드 페이지에 있는 다양한 JAR 파일은 무엇입니까?

    JDBC 드라이버에 대한 자세한 내용은 아래 테이블에서 확인하실 수 있습니다.

    • ojdbc10-full.tar.gz: 이 아카이브에는 최신 19.x JDBC Thin 드라이버(ojdbc10.jar), Universal Connection Pool(ucp.jar), Readme, 동반 jar가 포함되어 있습니다.
    • ojdbc8-full.tar.gz: 이 아카이브에는 최신 19.x JDBC Thin 드라이버(ojdbc8.jar), Universal Connection Pool(ucp.jar), Readme, 동반 jar가 포함되어 있습니다.
    • ojdbc10.jar: JDK11 및 JDK10 인증되었으며 모든 클래스에서 Thin 드라이버의 기본 기능 지원 특정 기능 사용 시 추가 jar 파일 필요
    • ojdbc8.jar: JDK9 및 JDK8 인증되었으며 모든 클래스에서 Thin 드라이버의 기본 기능 지원 특정 기능 사용 시 추가 jar 파일 필요
    • ucp.jar: 접속 풀 기능을 제공하는 Universal Connection Pool(UCP)입니다.
    • oraclepki.jar, osdt_core.jar 및 osdt_cert.jar: Java에서 Oracle Wallets에 액세스하려면 추가로 필요한 jar
    • orai18n.jar: Oracle Notification Services(ONS) 데몬에서 사용
    • simplefan.jar: ONS를 통해 RAC 이벤트를 구독하는 데 사용하는 Java API
    • xbd6.jar: 표준 JDBC 4.x java.sql.SQLXML 인터페이스를 지원하는 클래스
    • ojdbc8_g.jar: 디버깅 정보를 포함하도록 -g option으로 컴파일되고 java.util.logging 호출이 포함되었다는 점을 제외하면 ojdbc8.jar와 동일합니다.
    • ojdbc8dms.jar: Oracle Dynamic Monitoring Service (DMS)를 지원하는 코드가 포함되어 있다는 점을 제외하면 ojdbc8.jar와 동일합니다. JDBC 로깅 지원도 일부 포함되어 있습니다. 해당 파일은 dms.jar도 클래스 경로에 있는 경우에만 사용할 수 있습니다. dms.jar 파일은 RDBMS 제품의 일부로 제공되지 않습니다. Oracle Application Server 제품의 일부로만 사용할 수 있습니다.
    • ojdbc8dms_g.jar: 디버깅 정보를 포함하도록 -g 옵션으로 컴파일되고 총체적인 JDBC 로깅 지원이 제공되는 점을 제외하면 ojdbc8dms.jar과 동일합니다.

Oracle JDBC 일반 정보

  • 오라클에서 제공하는 JDBC 드라이버에는 어떤 것들이 있습니까?

    Oracle은 다양한 배포 시나리오에서 사용할 수 있는 4가지 유형의 JDBC 드라이버를 제공합니다. 모든 Oracle JDBC 드라이버는 유사하지만, 일부 기능은 JDBC OCI 드라이버에만 또는 JDBC Thin 드라이버에만 적용됩니다.

    • JDBC Thin 클라이언트 측 드라이버: Java를 사용하여 Oracle에 직접 접속하는 JDBC Type 4 드라이버입니다. 자체 TCP/IP 기반 Java 소켓 구현을 사용하여 오라클의 SQL*Net Net8 및 TTC 어댑터를 구현합니다. JDBC Thin 드라이버는 Oracle 클라이언트 소프트웨어를 설치할 필요가 없지만 서버를 TCP/IP 리스너로 구성해야 합니다. 대부분의 새로운 기능은 JDBC Thin 드라이버에서만 개발되므로 JDBC Thin 드라이버를 사용하는 것이 좋습니다. 이 드라이버는 전적으로 Java로 작성되었기 때문에 플랫폼 독립적입니다.
    • JDBC Thin 서버 측 드라이버: Java를 사용하여 오라클에 직접 접속하는 또 다른 JDBC Type 4 드라이버입니다. 이 드라이버는 Oracle 데이터베이스 내부에서 사용됩니다. 이 드라이버는 위의 클라이언트 측 JDBC Thin 드라이버와 같은 기능을 제공하지만, Oracle 데이터베이스 내부에서 실행되며 원격 데이터베이스에 액세스하는 데 사용됩니다. 이 드라이버는 전적으로 Java로 작성되었기 때문에 플랫폼 독립적입니다.
    • JDBC OCI 클라이언트측 드라이버: Java 네이티브 메서드를 사용하여 기본 C 라이브러리의 시작점을 호출하는 JDBC Type 2 드라이버입니다. OCI(Oracle Call Interface)라고 하는 이 C 라이브러리는 Oracle 데이터베이스와 상호 작용합니다. JDBC OCI 드라이버에는 드라이버와 같은 버전의 Oracle 클라이언트를 설치해야 합니다.

      네이티브 메서드를 사용하면 JDBC OCI 드라이버가 플랫폼에 종속됩니다. Oracle은 Solaris, Windows를 비롯해 다양한 플랫폼을 지원합니다.

      이 JDBC OCI 드라이버는 OCI Instant Client 기능으로 설치할 수 있어서 전체 Oracle 클라이언트 설치가 필요하지 않습니다. 자세한 내용은 Oracle Call Interface(Oracle 호출 인터페이스)를 참조하십시오.

    • JDBC 서버 측 내부 드라이버: Java 네이티브 메서드를 사용하여 기본 C 라이브러리의 시작점을 호출하는 또 다른 JDBC Type 2 드라이버입니다. 해당 C 라이브러리는 Oracle 서버 프로세스의 일부이며 호출 내에서 내부 SQL 엔진과 직접 통신하여 네트워크 트래픽을 방지합니다. 이렇게 하면 서버에서 실행 중인 Java 코드가 가능한 한 빨리 기본 데이터베이스에 액세스할 수 있습니다. 동일한 데이터베이스에 액세스하는 데만 사용할 수 있습니다. 네이티브 메서드를 사용하면 JDBC 서버 측 내부 드라이버가 플랫폼에 종속됩니다. 이 서버 측 내부 드라이버는 클라이언트 측 드라이버와 완전히 일치하며 동일한 기능과 확장 기능을 지원합니다.
  • 어떤 드라이버를 사용해야 합니까?

    Oracle JDBC thin 드라이버를 사용하는 것이 가장 좋습니다. 새로운 개선 사항과 기능은 모두 JDBC Thin 드라이버에서만 구현됩니다.

    비TCP/IP 네트워크를 사용하는 경우 OCI 드라이버를 사용해야 합니다.

    데이터베이스 세션 내 내부 처리(즉, 데이터베이스 내 Java)의 경우, 포함된 유형 2 드라이버(또는 Server Internal Driver)를 사용해야 합니다. 세션에서 실행 중인 Java 코드가 원격 Oracle 데이터베이스 또는 동일한 데이터베이스 인스턴스 내의 다른 세션에 액세스해야 하는 경우에는 포함된 유형 4 드라이버(또는 Server Thin Driver)를 사용해야 합니다.

  • Server Thin Driver와 Server Internal Driver용 JAR은 어떻습니까?

    이 두 드라이버는 모두 Oracle Server Java VM에서만 실행되며 해당 클래스는 VM을 설치하는 과정에서 설치됩니다. 이 드라이버에 사용하거나 필요한 별도의 클래스 파일은 없습니다. InternalT2Driver.java InternalT4Driver.java를 참조하십시오.

  • 타사 공급업체가 Oracle의 JDBC 드라이버를 자체 소프트웨어와 함께 배포할 수 있습니까?

    타사 소프트웨어 회사(및 Oracle 파트너)인 경우, FUTC 라이센스를 확인하고 귀사의 법무 부서와 검토한 다음 현지 Oracle 영업 담당자에게 자세한 내용을 문의하십시오.

  • Oracle JDBC 드라이버에 필요한 권한은 무엇입니까?

    SecurityManager를 사용하도록 설정(운용 시 설정 필수)한 상태에서 애플리케이션을 실행하면 특정 작업에 권한이 부여됩니다. 이러한 작업을 수행하려면 코드에 적절한 권한이 부여되어야 합니다.

    부여할 권한은 다운로드 페이지의 ojdbc.policy 파일에서 확인하면 됩니다. 이 파일은 일반 보안 정책 파일로, 드라이버에 필요한 모든 권한을 부여하는 데 사용할 수 있습니다. 일반적으로 앱에서 해당 권한이 필요한 기능을 사용하지 않으므로 대다수의 권한을 주석 처리해야 합니다.

    이 시스템은 여러 시스템 속성에 따라 달라집니다. 이 파일을 사용하려면 java 명령에 -D 옵션을 사용하여 해당 속성을 정의해야 합니다.

    일부 권한은 JDBC 드라이버 코드에만 부여하면 됩니다. 이러한 권한이 필요한 작업은 doPriviliged 블록으로 묶여 있습니다. 그 밖의 권한도 드라이버를 호출하는 코드에 부여되어야 합니다. 해당 작업은 doPriviliged 블록에 묶여 있지 않습니다. 한 가지 주목할 만한 예는 씬 드라이버를 사용하여 연결을 열 때 호출 코드에 개방 소켓 권한이 필요하다는 것입니다. 이를 통해 악성 코드가 서비스 거부 공격 등의 목적으로 드라이버를 사용하는 것을 방지할 수 있습니다.

설치

  • Thin 드라이버를 설치하려면 어떻게 해야 합니까?

    사용 중인 JDK 버전과 호환되는 Oracle JDBC 드라이버를 다운로드합니다. 최신 버전의 JDBC 드라이버는 다운로드 페이지에서 찾을 수 있습니다. 클래스 경로에 JDBC 드라이버가 포함되어야 합니다. 필요한 파일을 확인하려면 다운로드 페이지에 있는 다양한 JAR 파일은 무엇입니까?를 참조하십시오.

  • OCI 드라이버를 설치하려면 어떻게 해야 합니까?

    JDBC OCI 드라이버를 사용하려면 일반적으로 드라이버와 동일한 버전의 Oracle 클라이언트를 설치해야 합니다. 하지만 JDBC OCI 드라이버는 OCI Instant Client 기능을 통해 제공되므로 전체 Oracle 클라이언트 설치가 필요하지 않습니다. OCI Instant Client 설치에 대한 문서를 참조하시길 바랍니다.

  • 서버 측 내부 드라이버나 Thin 드라이버를 서버 드라이버에 설치하려면 어떻게 해야 합니까?

    설치할 필요가 없습니다. 이 두 드라이버는 데이터베이스를 설치하는 과정에 포함되어 설치됩니다. 데이터베이스를 Java 지원과 함께 설치했다면 이 두 드라이버는 이미 설치되어 있어 사용할 수 있습니다. 클래스 파일을 Oracle Server Java VM에 로드할 수 있습니까?를 참조하십시오.

DriverManager 및 DataSources

  • DriverManager와 DataSource의 차이점은 무엇입니까?

    java.sql.DriverManager 클래스를 사용하여 Connection을 만들도록 지정된 첫 번째 JDBC 버전입니다. 이 방식은 유연함이 부족하다고 평가되어 이후 버전의 JDBC 사양은 Data Sources를 사용하여 Connection을 만드는 방법을 추가로 정의하고 있습니다. DataSources를 사용하는 것이 좋습니다.

    DataSource를 사용하면 더 유연하게 Connection을 만들 수 있습니다. DataSource는 JNDI와 함께 사용하도록 설계되었지만 DataSource를 사용하기 위해 JNDI를 사용할 필요는 없습니다. 새 연결을 만드는 것 외에도 DataSource로 할 수 있는 작업은 다양합니다. 특히 DataSource로 접속 캐시를 구현할 수 있습니다. 현재는 DataSource가 Connection을 생성하는 데 널리 쓰이고 있습니다.

    DataSource로 가장 간단하게 접속하는 방법은 다음과 같습니다.

    ds = new oracle.jdbc.pool.OracleDataSource(); 
    ds.setURL(myURL); 
    conn = ds.getConnection(user, password);
  • 어떤 접속 풀을 사용해야 합니까?

    Universal Connection Pool(UCP)을 사용해야 합니다. 이 새로운 접속 캐싱 메커니즘은 드라이버, 프로토콜, 데이터베이스에 구애되지 않습니다. 오라클 데이터베이스가 아닌 데이터베이스에 비JDBC 접속과 JDBC 접속을 지원합니다. Oracle JDBC를 사용할 때는 다음과 같은 고급 Oracle 기능을 제공합니다.

    • 접속을 분할하고 재사용하는 접속 속성
    • VM별로 접속 캐시 관리자를 사용하여 하나 이상의 접속 캐시 관리
    • 유휴 체크 아웃된 접속 등을 회수하기 위해 접속 시간제한을 중단했습니다.
    • 런타임 접속 로드 밸런싱을 통해 가장 성능이 뛰어난 인스턴스에 작업 할당

    Oracle Implicit Connection Cache에 대한 지원이 중단되었습니다. 기존 접속 캐시인 OracleConnectionCacheImpl는 11.1에서 지원되지 않습니다.

  • JDBC OCI 접속 풀링이란?

    JDBC OCIConnectionPool은 데이터베이스와의 실제 접속이 거의 없는 여러 상태 저장 세션을 풀링하는 데 사용합니다. 접속은 호출하는 동안에만 세션에 바인딩됩니다. 풀 요소는 기본 실제 접속입니다. 애플리케이션 세션은 사용 가능한 실제 접속으로 (내부에서) 마이그레이션할 수 있습니다.

    풀의 각 실제 접속에는 서버에 대한 추가 내부 세션이 있습니다. 따라서 서버에서 더 많은 세션을 확인할 수 있습니다.

Connections

  • URL 형식은 무엇입니까?

    일반적인 URL 형식은 다음과 같습니다.

    jdbc:oracle:<drivertype>:<username/password>@<database>

    <drivertype(드라이버 유형)>

    • thin
    • oci
    • kprb

    <username(사용자 이름)/password(비밀번호)> 부분은 비어 있거나 형식을 따릅니다.

    <username>/<password>

    다음과 같은 URL은

    사용자 이름과 비밀번호가 비어 있지만 이 URL은

    jdbc:oracle:thin:@mydatabase

    지정된 사용자 이름과 비밀번호가 없습니다. 이 형식을 사용할 경우에는 사용자 이름과 비밀번호를 다른 방법으로 제공해야 합니다.

  • <database> 설명의 형식은 무엇입니까?

    <database> 설명은 드라이버 유형의 영향을 다소 받습니다. 드라이버 유형이 kprb이면 <database> 설명은 비어 있습니다. 드라이버 유형은 oci이고 bequeath 접속을 사용하려는 경우, <database>가 비어 있습니다. 그 밖의 경우( thin 또는 oci 드라이버이며 bequeath가 아닌 경우), 데이터베이스 설명은 다음 중 하나입니다.

    • //<host>:<port>/<service>
    • <host>:<port>:<SID>
    • <TNSName>

    다음 URL은 Thin 드라이버를 사용하여 호스트 myhost의 포트 1521을 통해 비밀번호가 tiger인 사용자 scottorcl(중요: 서비스 관련 추가 정보 참조) 서비스가 있는 데이터베이스에 접속합니다.

    jdbc:oracle:thin:scott/tiger@//myhost:1521/orcl

    이 URL은 사용자 이름이나 비밀번호를 지정하지 않고 OCI 드라이버와 SID inst1을 사용하여 같은 데이터베이스에 접속합니다.

    jdbc:oracle:oci:@myhost:1521:inst1

    이 URL은 사용자 이름이나 비밀번호를 지정하지 않고 Thin 드라이버를 사용하여 tnsnames.ora 파일에 있는 GL 데이터베이스에 접속합니다. 사용자 이름과 비밀번호는 별도로 지정해야 합니다.

    jdbc:oracle:thin:@GL

    릴리스 10.2.0.1.0부터는 Thin 드라이버와 함께 TNSNAMES 항목을 사용할 수 있도록 지원됩니다. 이 기능을 활용하려면 tnsnames.ora 파일을 올바르게 구성해야 합니다.

  • Properties 인수를 사용하려면 어떻게 해야 합니까?

    URL 외에도 표준 Java Properties 클래스의 객체를 입력으로 사용할 수 있습니다. 예:

    java.util.Properties info = new java.util.Properties(); 
    info.put ("user", "scott"); 
    info.put ("password","tiger"); 
    info.put ("defaultRowPrefetch","15"); 
    getConnection ("jdbc:oracle:oci:@",info);

    지원되는 속성은 모두 oracle.jdbc.OracleConnection.의 JavaDoc에 정의되어 있습니다. 속성 이름을 정의하는 상수가 있습니다. 각 상수에 대한 JavaDoc에서 속성의 기능과 사용 방법을 확인할 수 있습니다.

    11.1 이전 버전의 드라이버에서는 속성이 oracle.jdbc.pool.OracleDataSource.setConnectionProperties의 JavaDoc과 Oracle JDBC Developer's Guide에 정의되어 있습니다.

  • OracleDriver 클래스를 DriverManager에 등록해야 합니까?

    등록해도 문제가 발생하는 것은 아니지만, 더 이상 서버 측 내부 드라이버와 접속하기 위해 OracleDriver 클래스를 등록할 필요가 없습니다. 접속 시 getConnection()defaultConnection() 중 무엇을 사용하고 있든 그 여부와 관계없이 적용됩니다.

    ojdbc6.jar 및 JSE 6 이상을 사용하고 있다면 사용 중인 드라이버의 종류를 불문하고 드라이버를 등록할 필요가 전혀 없습니다. JSE 6부터는 표준 Java 서비스 공급자 인터페이스가 드라이버를 자동으로 등록합니다. DriverManager.getConnection을 호출하기만 하면 런타임이 드라이버를 찾아 등록해줍니다.

  • Server Internal Driver에 접속할 때 어떤 사용자 이름과 비밀번호를 사용해야 합니까?

    URL 문자열에 포함된 사용자 이름이나 비밀번호는 서버 기본 접속에 접속하는 과정에서 무시됩니다. DriverManager.getConnection() 메서드는 호출할 때마다 새로운 Java Connection 객체를 반환합니다. 메서드가 새 데이터베이스 접속을 생성하지는 않지만(암시적 접속 하나만 사용됨) 새 java.sql.Connection 객체를 반환합니다.

    마찬가지로 JDBC 코드가 대상 서버 내에서 실행 중일 때 접속은 암시적 데이터 채널이지 클라이언트에서와 같은 명시적 접속 인스턴스가 아닙니다. 절대 닫아서는 안 됩니다.

  • 기본 사전 인출 값을 더 높이 설정하면 OutofMemory 오류가 발생합니다.

    메모리 할당 풀의 시작 크기(-ms)와 최대 크기(-mx)를 늘리면 해결할 수 있습니다. 11.1 이상 드라이버는 10g 드라이버보다 메모리를 덜 사용하므로 이 문제가 발생할 확률이 낮습니다. JDBC OTN 웹 페이지의 "JDBC Memory Management(JDBC 메모리 관리)" 백서에 이 문제에 대한 자세한 정보를 찾을 수 있습니다.

  • 서비스 접속 문자열이란?

    오라클은 데이터베이스를 식별하는 데 사용하는 SID 메커니즘을 새로운 서비스 접근 방식으로 대체하고 있습니다. 새로운 방식은 8.1.wi7 이후의 데이터베이스에서 사용하실 수 있습니다. JDBC는 접속 URL의 서비스를 지원합니다. 다가올 몇 차례의 데이터베이스 릴리스에서 SID 지원이 중단될 예정이므로 가능한 한 빨리 SID에서 서비스로 전환하는 것이 좋습니다.

    서비스 URL의 기본 형식은 다음과 같습니다.

    jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service> jdbc:oracle:oci:[<user>/<password>]@//<host>[:<port>]/<service>

    예:

    dbc:oracle:thin:@//myserver.com/customer_db jdbc:oracle:oci:scott/tiger@//myserver.com:5521/customer_db

    자세한 내용은 JDBC User Guide를 참조하십시오.

  • SYSDBA나 SYSOPER로 접속하려면 어떻게 해야 합니까?

    사용자 이름과 비밀번호를 문자열로 지정하는 대신 접속 시 Properties 객체를 사용해야 합니다. "user" 속성에 사용자 이름을 입력하고 "password" 속성에 비밀번호를 입력합니다. 그런 다음 모드를 "internal_logon" 속성에 넣습니다. 다음과 유사합니다.

    Properties props = new Properties(); 
    props.put("user", "scott"); 
    props.put("password", "tiger"); 
    props.put("internal_logon", "sysoper"); 
    Connection conn = DriverManager.getConnection (url, props);

    Thin 드라이버를 사용하여 SYSDBA 또는 SYSOPER로 연결하는 경우에는 RDBMS가 비밀번호 파일을 사용하도록 구성해야 합니다. "Oracle Database Administrator's Guide"의 "Creating and Maintaining a Password File"를 참조하십시오.

  • Oracle JDBC 드라이버는 어떤 암호화 방법을 지원합니까?

    JDBC OCI 드라이버는 데이터베이스 서버와 동일한 알고리즘을 지원합니다.

    JDBC Thin 드라이버는 11.1 및 11.2에서 다음을 지원합니다.

    • RC4_40
    • RC4_56
    • RC4_128
    • RC4_256
    • DES40C
    • DES56C
    • 3DES112
    • 3DES168
    • SSL
    • AES256
    • AES192
    • AES128
  • JDBC Thin 드라이버를 사용하여 암호화 및 체크섬을 설정하려면 어떻게 해야 합니까?

    서버가 제대로 구성되었다면 다음 접속 속성을 사용합니다.

    Properties props = new Properties(); 
    props.put("oracle.net.encryption_types_client", "(3DES168)"); 
    props.put("oracle.net.encryption_client", "REQUIRED"); 
    props.put("oracle.net.crypto_checksum_types_client", "(MD5)"); 
    props.put("oracle.net.crypto_checksum_client", "REQUIRED");
  • 프록시 인증이란?

    프록시 인증은 다른 사용자를 통해 사용자로 접속할 수 있는 기능입니다. 예를 들어 프록시 인증을 사용하면 중간 계층에서 '일반' 계정을 사용하여 데이터베이스에 한 번 인증한 후 실제 사용자를 대신하여 경량 세션을 설정할 수 있습니다. oracle.jdbc.OracleConnection.openProxySession.의 JavaDoc를 참조하십시오.

  • Oracle JDBC 드라이버가 SSL을 지원합니까?

    예, 하지만 지원은 드라이버에 따라 다릅니다. SSL 암호화는 Oracle JDBC 9.2.x부터 JDBC-OCI 드라이버에서 지원되었으며 10.2부터는 THIN 드라이버에서 지원됩니다.

  • Oracle JDBC 드라이버는 접속 URL에서 LDAP를 지원합니까?

    예. JDBC THIN 드라이버는 접속 URL에서 일반 LDAP와 LDAP over SSL을 모두 지원합니다(예: Oracle Internet Directory를 LDAP 제공자로 사용할 경우). 자세한 내용은 Oracle JDBC Developer's Guide Oracle Net Services Administrator's Guide를 참조하십시오.

  • JDBC를 사용하여 방화벽 뒤에 있는 데이터베이스 서버에 접속하려면 어떻게 해야 합니까?

    일반적으로 Oracle Connection Manager를 사용하여 방화벽을 통해 접속을 프록시하는 것이 좋습니다. Oracle Connection Manager에서 사용하도록 지정한 포트만 열어주면 나머지는 알아서 처리됩니다. 데이터베이스 리스너가 사용 중인 포트(예: 포트 1521)를 직접 열어서는 안 됩니다.

    Oracle Connection Manager를 구성하는 방법은 Oracle Net Services Administrator's Guide를 참조하십시오.

Statements, PreparedStatements, CallableStatements

  • defineColumnType이란 무엇이며 언제 사용해야 합니까?

    defineColumnType는 경우에 따라 향상된 성능을 제공하는 Oracle JDBC 확장입니다. 이전 버전의 Oracle JDBC에서는 모든 드라이버가 defineColumnType 호출을 유용하게 활용했지만 10.1.0부터는 Thin 드라이버에 더 이상 해당 정보를 제공할 필요가 없습니다. Thin 드라이버는 defineColumnType을 호출하지 않고도 최고 성능을 발휘합니다. 그런데도 OCI 및 서버 측 내부 드라이버는 애플리케이션이 defineColumnType을 사용할 때 성능이 향상됩니다.

    코드를 Thin 드라이버와 OCI 드라이버 모두와 사용할 경우, 접속 속성 disableDefineColumnType"true"로 설정하여 Thin을 사용할 때 defineColumnType 메서드를 사용하지 않을 수 있습니다. 이렇게 하면 defineColumnType이 NOOP가 됩니다. OCI 또는 서버 측 내부 드라이버를 사용할 때는 이 접속 속성을 설정하지 않거나 "false"로 설정해야 합니다.

    열 유형 정의를 사용하여 데이터 유형을 변경할 수도 있습니다. 또는 가변 길이 데이터의 크기를 제한하는 데 사용할 수도 있습니다.

    이에 대한 새로운 변형이 있으며 4번째 form_of_use 매개변수가 포함되어 있습니다.

  • defineColumnType은 서버에서 강제로 변환합니까?

    Thin 드라이버는 아니지만, OCI와 서버 측 내부 드라이버의 경우에는 그렇습니다.

  • 애플리케이션 코드에서 stmt.setEscapeProcessing(false)를 호출하는 대신 jdbc 드라이버 수준에서 EscapeProcessing을 해제하려면 어떻게 해야 합니까?

    OracleConnection에서 'CONNECTION_PROPERTY_PROCESS_ESCAPES' 속성을 사용하면 됩니다.

  • Oracle JDBC 드라이버는 Bind by Name 기능을 제공합니까?

    예. oracle.jdbc.OraclePreparedStatement의 JavaDoc을 참조하십시오. setXXXAtName 메서드를 찾아보십시오. 또한 oracle.jdbc.OracleCallableStatement는 공식 인수 이름으로 PL/SQL 프로시저에 인수를 바인딩할 수 있도록 지원합니다. oracle.jdbc.OracleCallableStatement.setXXX(String, ...) 메서드의 JavaDoc를 확인하십시오.

    setXXX(String, XXX)은 호출된 저장 프로시저의 공식 매개변수 이름을 사용하여 바인딩한다는 점에 유의해야 합니다. setXXXAtName(String, XXX)은 실행 중인 SQL 문자열에서 Oracle 스타일(:foo) 매개변수의 이름을 사용하여 바인딩합니다. 이 둘의 차이는 극명하며 결과 또한 크게 다를 수 있습니다.

  • PreparedStatement의 setXXX 메서드의 경우, Oracle JDBC 드라이버는 데이터 유형을 어떻게 결정합니까?

    일반적으로 각 setXXX 메서드에는 인수 유형에 가장 합리적으로 부합하는 고정된 데이터 유형이 연결되어 있습니다.

  • 대상 매개 변수의 유형이 set XXX 메서드에서 가정한 유형과 일치하지 않으면 어떻게 됩니까?

    데이터는 가정된 데이터 유형의 형식으로 서버에 전송되고, 서버는 이를 대상 매개변수 유형으로 변환을 시도합니다. 변환할 수 없는 경우, 서버는 오류 신호를 보내고 드라이버를 실행하면 SQLException이 발생합니다.

  • 드라이버가 클라이언트 측에서 변환하지 않은 이유는 무엇입니까?

    SQL 문의 경우, 먼저 서버로 이동하여 유형 정보를 가져온 다음 변환할 수 있지만 라운드 트립이 추가로 발생합니다. 코드는 JDBC 프로그래머가 열 유형에 가장 적합한 API를 사용하는 일반적인 사례에 최적화되어 있습니다.

  • 테이블의 열에 삽입할 때 사용할 바이트 데이터 유형에는 어떤 것들이 있습니까?

    Oracle SQL 바이트 데이터 유형으로는 RAW, LONG RAW, BLOB 등 총 3가지가 있습니다. RAW 데이터는 길이가 제한되어 있으며 열에 직접 저장되고 인라인 패킷으로 서버로 전송됩니다. LONG RAW 데이터는 크기 제한이 훨씬 더 크며(2기가바이트), 특수 메커니즘을 통해 행과 함께 저장되고 스트리밍 콜백 메커니즘을 통해 서버로 전송됩니다. BLOB 데이터는 실질적으로 길이 제한이 없으며, 테이블에는 LOB 로케이터만 저장된 상태로 테이블과 별도로 저장되고 로케이터가 테이블 열에 저장되기 전에 별도의 작업으로 서버로 전송됩니다.

  • 테이블의 열에 삽입할 때 사용할 문자 데이터 유형에는 어떤 것들이 있습니까?

    Oracle SQL 바이트 데이터 유형으로는 VARCHAR2, LONG, CLOB 등 총 3가지가 있습니다. VARCHAR2 데이터는 길이가 제한되어 있으며 열에 직접 저장되고 인라인 패킷으로 서버로 전송됩니다. LONG 데이터는 크기 제한이 훨씬 더 크며(2기가바이트), 특수 메커니즘을 통해 행과 함께 저장되고 스트리밍 콜백 메커니즘을 통해 서버로 전송됩니다. CLOB 데이터는 실질적으로 길이 제한이 없으며, 테이블에는 LOB 로케이터만 저장된 상태로 테이블과 별도로 저장되고 로케이터가 테이블 열에 저장되기 전에 별도의 작업으로 서버로 전송됩니다.

  • setString, setCharacterStream, setAsciiStream의 크기는 어떻게 됩니까?
    드라이버 하한 상한 바인드 메커니즘 참고
    모두 모두 모두 0 0 Null  
    모두 SQL 클라이언트 1자 32,766자 직접  
                 
    모두 SQL 클라이언트 32,767자 2,147,483,647바이트 스트림  
    모두 SQL 클라이언트 2,147,483,648바이트 2,147,483,647자 임시 Clob  
    CHAR   서버 1자 65,536바이트 직접 1, 2
    NCHAR     1자 4,000바이트 직접  
    NCHAR     4,001바이트 2,147,483,647자 임시 Clob  
    CHAR     65,537바이트 2,147,483,647바이트 스트림  
          2,147,483,647바이트 2,147,483,647자 임시 Clob  
                 
    모두 PL/SQL 모두 1자 32,512자 직접  
    모두 PL/SQL 모두 32,513자 2,147,483,647자 임시 Clob  
  • setBytes와 setBinaryStream을 통한 이진 데이터의 크기 제한은 어떻게 됩니까?
    드라이버 하한 상한 바인드 메커니즘 참고
    모두 모두 모두 0 0 Null  
    모두 SQL 클라이언트 1자 32,766자 직접  
                 
    모두 SQL 클라이언트 32,767자 2,147,483,647바이트 스트림  
    모두 SQL 클라이언트 2,147,483,648바이트 2,147,483,647자 임시 Clob  
    CHAR   서버 1자 65,536바이트 직접 1, 2
    NCHAR     1자 4,000바이트 직접  
    NCHAR     4,001바이트 2,147,483,647자 임시 Clob  
    CHAR     65,537바이트 2,147,483,647바이트 스트림  
          2,147,483,647바이트 2,147,483,647자 임시 Clob  
    모두 PL/SQL 모두 1자 32,512자 직접  
    모두 PL/SQL 모두 32,513자 2,147,483,647자 임시 Clob  

    참고:

    다음으로 대체 가능

    begin Insert into blob_tab (blob_col) values (? ); end;

    1. 서버 측 내부 드라이버는 2,000바이트보다 용량이 큰 SQL 구문의 BLOB 매개변수 데이터를 변환할 수 없습니다. PL/SQL 문에는 이와 같은 제한이 적용되지 않습니다. 대부분의 경우 SQL을 PL/SQL로 래핑하여 이러한 문제를 해결할 수 있습니다. 예를 들어 Java 문자열을 blob_tab(blob_col) 값(?)에 삽입합니다.
    2. Oracle 특정 메소드 setBytesForBlob을 대안으로 사용할 수 있습니다.
  • oracle.jdbc.OraclePreparedStatement의 독점 메소드 setBytesForBlob, setStringForClob에 대한 크기 제한은 어떻게 됩니까?
    API 양식 드라이버 하한 상한 바인드 메커니즘 참고
    setBytesForBlob 해당 없음 모두 모두 0 0 Null  
        모두 클라이언트 1바이트 2,000바이트 직접  
        모두 클라이언트 2,001바이트 21,474,836,487바이트 임시 BLOB 2
    setStringForClob 모두 모두 모두 0 0 Null  
      모두 모두 클라이언트 1자 32,766자 직접  
      모두 모두 클라이언트 32,767자 2,147,483,647자 임시 CLOB  
      모두 모두 서버 1자 4,000바이트 직접  
      모두 모두 서버 4,001바이트 2,147,483,647자 임시 CLOB 1

    참고:

    1. Oracle 특정 메소드 setStringForClob을 대안으로 사용할 수 있습니다.
    2. Oracle 특정 메소드 setBytesForBlob을 대안으로 사용할 수 있습니다.
  • 바인드 유형을 전환하면 서버 측에서 강제로 명령문을 추가로 구문 분석합니까?

    예.

  • CallableStatementsIN OUT 매개변수가 있는 프로시저는 어떻습니까?

    IN 매개변수와 OUT 매개변수의 데이터 유형은 같아야 합니다. 사용자 코드가 registerOutParameter의 유형도 변경하지 않는 한 자동 전환으로 인해 충돌이 발생합니다. 이러한 문제가 발생할 수 있는 환경에서는 IN OUT 매개변수를 사용하지 않는 것이 바람직합니다. 이 작업은 래퍼 프로시저 또는 별도의 IN 및 OUT 매개변수를 사용하는 PL/SQL 블록을 추가하는 방법으로 원래 프로시저를 변경하여 수행할 수 있습니다.

  • 바인드 유형이 변경되면 다형 형식 PL/SQL 프로시저 선택 항목이 변경됩니까?

    예. 이것이 PL/SQL 코드에서 악용될 수 있다는 점을 고려해야 합니다.

  • 기존 코드는 어떻습니까?

    기존 코드는 변함없이 정상 작동합니다. 다만 한 가지 변동 사항이 있습니다. 기존에는 입력이 사용 API의 크기 제한을 초과하면 setXXX API가 호출될 때 SQLException이 발생했습니다. 이제 해당 예외는 실행 시점에만 발생합니다.

  • 특정 상황에선 드라이브가 임시 LOB를 생성합니다. 이러한 사항을 추적하고 해제합니까?

    예, 다음 명령문을 실행한 후 또는 명령문이 종료될 때 해제됩니다.

  • UTF8와 같은 가변 너비 문자세트를 사용하고 있습니다. 드라이버가 문자 시퀀스의 실제 바이트 길이를 수정합니까?

    예. 최대 크기를 가정하여 최대 문자열을 CLOB으로 변경하는 결정을 제외하고 그렇습니다.

  • 예를 들어, setString을 매우 큰 문자열에 사용하는 것이 좋습니까?

    애당초 매우 큰 문자열을 생성하는 것은 바람직하지 않습니다. 초대형 객체가 Java 메모리 관리 시스템에 미치는 영향에 대해서는 사용하시는 Java Virtual Machine 공급업체의 설명서를 참조하십시오.

  • LONG RAWLONG 열 유형은 더 이상 사용되지 않습니다. setXXXStream API가 새로 사용되는 이유는 무엇입니까?

    스트림 API가 더 이상 사용되지 않는 것이 아닙니다. 특정 작업에서는 LOB API보다 뛰어난 성능을 발휘하므로 유지될 예정입니다.

  • LOB API가 훨씬 더 유연하다는 것이 사실입니까?

    물론입니다! LOB API를 사용하면 LOB의 모든 부분에 임의로 액세스할 수 있습니다. 필요한 경우에 사용해 보시길 바랍니다.

  • select * from tab where id in (?, ?, ?, ...)를 수행하는 PreparedStatement를 생성할 수 없는 이유는 무엇입니까?

    RDBMS가 IN 절에 있는 요소의 바인드 매개변수를 지원하지 않는다는 점이 원인입니다. 데이터베이스의 한계이지, 드라이버 문제가 아닙니다.

ResultSets

  • "Exhausted Resultset: prepare_for_new_get"은 무엇을 의미합니까?

    이 오류는 ResultSet을 종료한 후 사용하려고 하면 발생합니다. ResultSet을 생성한 문을 종료하는 경우에도 발생합니다.

    ResultSet rset = stmt.executeQuery ("select ROWID from EMP"); ... rset.close (); // or stmt.close (); rset.getString (1);

  • ResultSets를 종료해야 하는 이유는 무엇입니까?

    원래 JDBC 사양에서는 더 이상 접속할 수 없을 때 Connection, Statement, ResultSet를 닫도록 하였습니다. 이 경우, 종료자를 사용해야 합니다. 종료자가 JVM에서 실행되는 애플리케이션에 포함되면 전반적으로 상당한 성능 저하를 초래합니다. Sun에서는 종료자의 사용을 권장하지 않습니다. 자동 종료를 사용하면 종료자도 사용해야 하는데 이는 고객별 자동 종료 사용 여부와 관계없이 고객 모두에게 바람직하지 않습니다. 수긍할 수 있는 절충안이 아닙니다.

    바로 이러한 이유로 인하여 DBC 드라이버에 자동 종료를 구현한 공급업체는 없는 것으로 알고 있습니다. 해당 요구 사항은 사양에서 제거되었지만, 문구가 남아있는 경우가 일부 있습니다. JDBC 자습서에도 나옵니다. 자습서가 유용한 정보를 제공하기는 하지만 확정된 것은 아닙니다. 수년 간 업데이트되고 있지 않습니다. JDBC 4.0 사양에서는 자동 종료가 필요하지 않습니다.

    ResultSet, Statemnent, Connection은 모두 클라이언트와 서버 양측의 리소스를 씁니다. 해당 객체가 열려 있는 한 관련 리소스가 할당됩니다. 리소스는 객체가 닫힐 때 해제됩니다. ResultSet, Statement 및/또는 Connection을 닫지 않으면 리소스가 누출되거나 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다.

    Connection을 닫으면 연관된 Statement가 모두 닫힙니다. Statement를 닫으면 연관된 ResultSet가 모두 닫힙니다. 따라서 완료한 Connection만 닫으면 모든 Statement와 ResultSet가 닫힙니다. 무난한 프로그래밍 습관입니다. 최선책은 최종 블록에서 Statement과 ResultSet를 명시적으로 닫는 것입니다. 이렇게 하면 애플리케이션이 변화하는 요구 사항을 충족하도록 발전하면서 성능이 더욱 강력해지고 리소스가 누출될 가능성도 줄어듭니다.

    PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); try { rs = ps.executeQuery(); while (rs.next()) { // process row } } finally { if (rs != null) rs.close(); } } finally { if (ps != null) ps.close(); }

단순 데이터 유형

  • DATETIMESTAMP에 대해 알아야 할 사항이 있습니까?

    이 섹션에서는 단순 데이터 유형을 다룹니다. :-)

    9.2 이전에는 Oracle JDBC 드라이버가 DATE SQL 유형을 java.sql.Timestamp.에 매핑했습니다. Oracle DATE SQL 유형에는 java.sql.Timestamp와 마찬가지로 날짜와 시간 정보가 모두 포함되어 있으므로 합리적이었습니다. java.sql.Date에 매핑하는 것이 당연해 보여도 java.sql.Date는 시간 정보를 포함하지 않는다는 문제가 있었습니다. 또한 RDBMS가 TIMESTAMP SQL 유형을 지원하지 않아 DATETimestamp에 매핑하는 것이 이상하지 않은 상황이기도 했습니다.

    9.2에서는 RDBMS에 TIMESTAMP 지원이 추가되었습니다. TIMESTAMP에는 나노초가 있고 DATE에는 없는 것이 DATETIMESTAMP의 차이점입니다. 따라서 9.2부터 DATEDate에 매핑되고 TIMESTAMPTimestamp에 매핑됩니다. 안타깝게도 DATE 값을 사용하여 시간 정보를 저장했다면 문제가 발생합니다.

    9.2에서 10.2 드라이버에서는 여러 방법으로 이 문제를 해결할 수 있습니다.

    • DATE 대신 TIMESTAMP를 사용하도록 테이블을 변경합니다. 이 방법을 쓸 수 있는 경우는 거의 없지만, 쓸 수 있을 때는 최선책입니다.
    • 애플리케이션이 defineColumnType을 사용하여 열을 DATE 대신 TIMESTAMP로 정의하도록 변경합니다. defineColumnType은 꼭 써야 하는 경우가 아니라면 쓰지 않는 것이 좋으므로 이 방법에도 문제가 있습니다(defineColumnType이란 무엇이며 언제 사용해야 합니까? 참조).
    • getObject 대신 getTimestamp를 사용하도록 애플리케이션을 변경합니다. 쓸 수만 있다면 훌륭한 해결책이지만, getObject를 사용하는 일반 코드가 포함된 애플리케이션이 많아 항상 사용 가능한 방안은 아닙니다.
    • V8Compatible 접속 속성을 설정합니다. 이렇게 하면 JDBC 드라이버가 새 매핑 대신 이전 매핑을 사용하도록 지시합니다. 이 플래그는 접속 속성 또는 시스템 속성으로 설정할 수 있습니다. 연결 속성은 DriverManager.getConnection 또는 OracleDataSource.setConnectionProperties에 전달된 java.util.Properties 객체에 추가하여 설정합니다. java 명령줄에 -D 옵션을 포함하여 시스템 속성을 설정합니다.
      java -Doracle.jdbc.V8Compatible="true" MyApp

    Oracle JDBC 11.1은 이 문제를 해결합니다. 이 릴리스부터 드라이버는 기본적으로 SQL DATE 열을 java.sql.Timestamp에 매핑합니다. 올바른 매핑을 얻기 위해 V8Compatible을 설정할 필요가 없습니다. V8Compatible는 더 이상 사용되지 않습니다. 절대 사용해서는 안 됩니다. true로 설정하면 아무런 문제가 없지만, 사용을 중지해야 합니다.

    이러한 방식으로 사용된 경우는 거의 없었지만, V8Compatible는 DATE 대 Date 문제를 해결하기 보다는 8i 데이터베이스와의 호환성을 지원하는 목적으로 존재했습니다. 8i를 비롯한 이전 데이터베이스는 TIMESTAMP 유형을 지원하지 않았습니다. V8Compatible을 설정하면 데이터베이스에서 읽어올 때 SQL DATE가 Timestamp 로 매핑될 뿐만 아니라 데이터베이스에 기록할 때 모든 Timestamp가 SQL DATE로 변환됩니다. 8i는 지원되지 않으므로 11.1 JDBC 드라이버는 이 호환성 모드를 지원하지 않습니다. 따라서 V8Compatible은 지원되지 않습니다.

    위에서 설명한 것처럼 11.1 드라이버는 기본적으로 데이터베이스에서 읽어올 때 SQL DATE를 Timestamp로 변환합니다. 항상 이렇게 동작하는 것이 바람직하므로 9i에서 변경된 것은 실수였습니다. 11.1 드라이버에서는 올바른 동작으로 되돌아갔습니다. 애플리케이션에 V8Compatible을 설정하지 않았더라도 대개는 동작에 차이가 없습니다. getObject를 사용하여 DATE 열을 읽는 경우에는 차이가 느껴질 수도 있습니다. 결과는 Date가 아닌 Timestamp가 됩니다. TimestampDate의 하위 클래스이므로 일반적으로 문제가 되지 않습니다. 시간 구성 요소를 잘라내기 위해 DATE를 Date로 변환했거나 값에 toString을 사용한 경우에 차이가 있음을 알 수 있습니다. 그 외의 경우에는 변경 여부를 알 수 없어야 합니다.

    어떤 이유로든 앱이 이 변경 사항에 매우 민감하며 단순히 9i-10g 동작을 갖춰야 하는 경우에 설정할 수 있는 접속 속성이 있습니다. mapDateToTimestamp를 false로 설정하면 드라이버가 기본 9i-10g 동작으로 되돌아가고 DATE를 Date에 매핑합니다.

  • 바인드할 수 있는 가장 긴 값은 무엇입니까?
    방법 열 유형 최대 길이
    setBytes LONG 4천 바이트
    setBytes LONG RAW 20억 바이트
    setString LONG 3.2만 자(SetBigStringTryClob="false")
    4천 자(SetBigStringTryClob="true")
    setString CLOB 20억 자

    9.2에서는 LONG에 setString()을 쓰면 OCI 드라이버에서는 최대 6.4만 자, Thin 드라이버에서는 4천 자를 넣을 수 있습니다. 10.1.0에서는 두 드라이버의 제한을 3.2만 자로 변경했습니다. 일부 고객은 OCI 제한을 6.4만에서 3.2만으로 줄인 결정으로 인해 문제를 겪을 수 있다는 사실을 인지하고 있습니다. 그러나 이렇게 변경함으로써 얻을 수 있는 상당한 성능 향상 효과는 물론 오라클이 고객에게 LONG에서 CLOB로 마이그레이션할 것을 강력히 권장하고 있다는 점을 고려하여 아키텍처 변경이 필요하다고 판단했습니다.

    3.2만 자 이상에 setString()을 사용해야 하는 고객은 LONG에서 CLOB로 마이그레이션하는 것이 좋습니다.

  • TIMESTAMP WITH TIME ZONE으로 읽은 결과가 다른 이유는 무엇입니까?

    이전 동작이 올바르지 않았습니다. 버그 4322830을 참조하십시오.

    이전 동작은 데이터베이스값과 같은 값을 출력하는 Timestamp를 생성하는 것이었습니다. 그러나 Timestamp는 UTC 시간대 기준이어서 올바른 값에서 오프셋된 Timestamp 값을 반환했습니다. UTC 기준의 2007년 1월 1일 오전 8시는 PST 기준의 2007년 1월 1일 오전 8시와 다릅니다. 각각 서로 다른 시점을 나타냅니다.

    데이터베이스에서 PST 기준의 2007년 1월 1일 오전 8시를 읽으면 9i와 10g 드라이버는 UTC 기준으로 값이 2007년 1월 1일 오전 8시인 Timestamp를 구성합니다. 이 값은 "올바르게" 출력됩니다. 즉, "2007년 1월 1일 오전 8:00"로 출력은 되었지만, 명백하게 잘못된 시간을 표시하고 있습니다. 11.1 드라이버는이 버그를 수정합니다.

고급 데이터 유형(객체)

  • ADT 인스턴스를 생성하려면 어떻게 해야 합니까?

    JDBC 4.0에서는 ADT 인스턴스를 생성하기 위해 Connection(접속) 인터페이스에 팩토리 메서드를 도입했습니다. 생성자를 사용하는 것보다 훨씬 효과적인 API입니다. 가능한 한 팩토리 메서드를 사용하는 것이 좋습니다. 생성자는 곧 사용되지 않을 예정이며 가능한 한 빨리 지원도 중단하고자 합니다.

    표준 팩터리 메서드가 JDBC 4.0에 도입되었으므로 이러한 메서드는 JSE 6 드라이버(ojdbc6.jar)에서만 사용할 수 있습니다. Oracle 전용 유형을 생성하는 경우, 팩토리 메서드는는 JSE 5 및 JSE 6(ojdbc5.jar 및 ojdbc6.jar)용 OracleConnection에 정의되어 있습니다. 다시 한번, 팩토리 메서드를 사용하시는 것을 강력히 추천합니다.

  • 표준 팩토리 메소드 createArrayOf가 지원되지 않는 이유는 무엇입니까?

    SQL 표준 배열 유형은 익명입니다. 즉, "foo 배열" 유형에는 이름이 없습니다. 요소 유형에만 이름이 지정됩니다. Oracle SQL에서는 배열 유형에 이름이 지정됩니다. 실제로 익명 배열 유형은 지원되지 않습니다. 따라서 JDBC 4.0 표준 팩토리 메서드는 요소 유형을 인수로 사용하여 익명 배열 유형의 인스턴스를 생성합니다. Oracle JDBC 드라이버는 Oracle 전용 메서드인 createArray를 정의합니다. 이 메서드는 배열 유형의 이름을 사용하여 명명된 배열 유형의 인스턴스를 반환합니다. 이는 Oracle SQL이 정의된 방식에 따라 필요합니다. 현재 Oracle 데이터베이스는 JDBC 4.0 표준 createArrayOf 메서드를 지원할 수 없습니다.

BFILE, BLOB, CLOB

  • DBMS_LOB.ERASE의 기능은 무엇입니까?

    CLOB의 세그먼트를 "지우기"만 합니다. CLOB를 단축하지 "않습니다". 따라서 CLOB의 길이는 ERASE 하기 전과 후가 같습니다. DBMS_LOB.TRIM을 사용하여 CLOB를 더 짧게 만들 수 있습니다.

  • oracle.sql.CLOB.putChars()를 사용할 수 있습니까?

    네, 사용할 수 있지만 위치와 길이 인수가 올바른지 확인해야 합니다. 또한 putChars를 호출하는 권장 OutputStream 인터페이스를 사용할 수 있습니다.

  • OCI는 CLOB CharSetId 조작 기능을 제공합니다. JDBC에는 이에 상응하는 기능이 있습니까?

    JDBC에서 CLOB는 *항상* Java "char" 유형에 해당하는 Oracle 문자 세트인 USC2로 되어 있습니다. 따라서 OCI CLOB CharSetId에 해당하는 기능은 없습니다.

  • BLOBS로 쓰는 것이 LONG RAW를 삽입하는 것보다 느립니까?

    상황에 따라 다릅니다. 10K 미만의 작은 값을 쓸 때는 LONG RAW가 더 빠릅니다. 그보다 큰 값을 작성할 때는 차이가 없습니다.

  • Stream 샘플 코드에서 LobLength를 가져올 때 ORA-03127 오류가 발생하는 이유는 무엇입니까?

    올바르게 동작한 것입니다. LONG 열은 내부(즉, 행 내)에서 '인출'되지 않습니다. 이러한 객체는 외부로 인출되어 사용자가 명시적으로 읽을 때까지 파이프에 유지됩니다. 이 경우 LONG 열을 읽기 전에 LobLocator(getBlob())를 사용하여 이 LOB의 길이를 구하려고 합니다. 파이프가 분명하지 않아 위와 같은 예외가 발생합니다. BLOB에 작업을 수행하기 전에 Long 열 읽기를 완료하면 이 문제를 해결할 수 있습니다.

  • 데이터베이스에서 CLOB를 가져온 다음 업데이트하면 변경한 내용이 데이터베이스에 나타나지 않을 때가 있습니다. 그 이유는 무엇일까요?

    Oracle LOB는 의미 체계를 사용합니다. LOB를 업데이트하고 변경 사항을 확인하려면 LOB를 데이터베이스에 다시 기록해야 합니다. LOB를 기록하지 않아도 기술적인 연유로 변경 사항이 저장되는 경우가 있지만, 그 시점을 예측할 수 없으므로 항상 LOB를 기록해야 합니다.

REF 유형

  • 서로 다른 두 JDBC 클라이언트(EJB, JDBC 클라이언트 등) 간에 oracle.sql.REF를 전달하려면 어떻게 해야 합니까? REF 클래스를 직렬화할 수 없으니 더욱 궁금합니다.

    REF 클래스를 직렬화할 수 없다는 것은 더 이상 사실이 아닙니다. 이제 REF를 직렬화할 수 있습니다.

    REF를 직렬화할 수 없는 이전 버전의 Oracle JDBC 드라이버를 사용하신다면 다음 참고 사항이 유용할 수 있습니다.

    REF 클래스를 구성하는 중요한 요소는 객체 참조를 나타내는 바이트 배열과 정규화된 객체 유형 이름입니다. 다음의 "Some REF" 클래스와 같은 클래스를 사용하여 개체 REF의 바이트 및 유형 이름을 보관할 수 있습니다. 이 클래스는 직렬화할 수 있습니다. 매개변수로 JDBC Connection이 있어야 하는 "toREF" 메서드를 사용하여 REF를 다시 만들 수 있습니다.

    public class SomeREF implements java.io.Serializable { String typeName; byte[] bytes; public SomeREF (oracle.sql.REF ref) throws SQLException { this.typeName = ref.getBaseTypeName (); this.bytes = ref.getBytes (); } public oracle.sql.REF toREF (Connection conn) throws SQLException { return new oracle.sql.REF (new oracle.sql.StructDescriptor (typeName,conn),conn, bytes); } }

  • 새 REF를 만들려면 어떻게 해야 합니까?

    Oracle8 Object 유형에 대한 REF가 있는 테이블에 대해 쿼리를 실행할 수 있으며, REF는 JDBC에 의해 Java oracle.sql.REF 객체로 구체화됩니다. JDBC는 새 REF를 처음부터 생성하는 것을 지원하지 않습니다. 데이터베이스로 이동하여 SQL에 새 REF를 삽입해야 합니다. 그런 다음 REF를 다시 선택해 클라이언트에 반환해야 합니다.

    PL/SQL 블록을 사용하면 더 쉽게 할 수 있습니다. 예를 들어, 다음과 같은 테이블이 있는 경우

    create or replace type point as object (x number, y number); create table point_values_table of point; create table point_ref_table (p ref point). point_values_table에 새 포인트 값을 삽입하고 point_ref_table에는 새 ref를 삽입한 후 다음 코드를 사용하여 REF를 클라이언트에 반환할 수 있습니다. oracle.jdbc.driver.OracleCallableStatement call = (oracle.jdbc.driver.OracleCallableStatement) conn.prepareCall ("declare x ref point; " + "begin insert into point_values_table p values (point(10, 20))" + " returning ref(p) into x; " + " ? := x; " + "end;"); call.registerOutParameter (1, oracle.jdbc.driver.OracleTypes.REF,"SCOTT.POINT"); call.execute (); oracle.sql.REF ref = (oracle.sql.REF)call.getObject (1);

OPAQUE 유형

  • OPAQUE 유형이란?

    TOPAQUE 유형에는 바이너리 데이터와 지원 메서드가 있으며 이들은 서버 네이티브 코드 라이브러리에 정의되어 있습니다. Oracle 내부에서만 사용할 수 있습니다.

행 소스

  • 실행 후 스크롤 가능 여부(scrollability) 속성을 설정해도 RowSet의 스크롤 가능 여부에 영향을 주지 않습니다. 그 이유는 무엇일까요?

    Bean의 속성은 다음과 같이 분류할 수 있습니다.

    • 객체 생성 속성
    • 런타임 속성

    객체 생성 속성은 객체 생성에 핵심적인 속성이므로 객체를 생성하기 전에 설정해야 합니다. 런타임 속성은 언제든지 설정할 수 있으며 런타임에 Bean의 동작을 변경합니다.

    스크롤 가능 여부(Scrollability), 사용자 이름, 비밀번호는 모두 객체 생성 속성입니다. 상태 자동 커밋, 사전 인출 횟수 등은 모두 런타임 속성입니다. 일반적으로 백그라운드 객체는 execute/setCommand 중에 활성화되므로 모든 문(Statement) 작성 속성은 그 전에 설정해야 합니다. 문 URL(Statement URL)을 만들려면 접속 객체가 필요하므로 명령(Command)을 설정하기 전에 접속 객체를 만드는 데 필요한 사용자 이름, 비밀번호 등을 설정해야 합니다.

  • RowSet에 스트림이 포함되어 있더라도 RowSet 객체를 플랫 파일로 직렬화할 수 있습니까?

    예, 직렬화 가능 스트림을 사용하면 플랫 파일, 네트워크 연결 등과 같은 직렬화 가능 미디어에서 스트림 객체를 직렬화할 수 있습니다. 이 기능은 CachedRowSet에만 적용됩니다. JDBC 드라이버가 있는 시스템에서 CachedRowSet을 생성한 후, 드라이버 바이너리 대신 행 집합 바이너리만 있는 원격 클라이언트로 옮길 수 있습니다. 원격 클라이언트는 삽입, 삭제 또는 업데이트하여 RowSet을 변경할 수 있습니다. 그런 다음 수정된 값을 데이터베이스에 동기화하기 위해 다시 JDBC 드라이버와 RowSet 바이너리가 있는 위치로 보냅니다.

Thin 드라이버

  • Thin JDBC 드라이버를 사용하여 Java 애플리케이션을 개발할 수 있습니까?

    예, Thin JDBC 드라이버를 사용하여 Java 애플리케이션을 개발할 수 있습니다. JDBC OCI 드라이버와 달리 Thin JDBC 드라이버는 TCP/IP 기반 네트워크에서만 작동합니다. 비TCP/IP 네트워크에서 애플리케이션을 실행하는 경우에는 JDBC OCI 드라이버를 사용하는 것이 좋습니다.

Server Internal Driver

  • Server Internal Driver는 언제 사용해야 합니까?

    Server Internal Driver는 Java 저장 프로시저에서 데이터베이스에 액세스할 때 사용해야 합니다. Java 저장 프로시저는 PL/SQL이 RDBMS에서 실행되는 것처럼 Oracle RDBMS 내부에서 실행되는 Java 메서드입니다. RDBMS에서 실행되기 때문에 반드시 데이터베이스 세션에서 실행됩니다. Server Internal Driver 접속은 해당 데이터베이스 세션의 핸들입니다. 따라서 코드를 Java 저장 프로시저에서 실행하면서 데이터베이스에 액세스하려는 경우에는 Server Thin Driver를 사용해야 하는 드문 경우를 제외하고 Server Internal Driver를 사용하십시오.

Server Thin Driver

  • Server Thin Driver는 언제 사용해야 합니까?

    일반적으로 Java 저장 프로시저에서는 Server Internal Driver를 사용해야 합니다. 저장 프로시저가 실행되는 세션과 같은 세션에 접속합니다. 그러나 경우에 따라 다른 데이터베이스나 같은 데이터베이스 내 새 세션에 연결해야 할 수도 있습니다. 두 경우 모두 Server Thin Driver를 사용합니다.

에러

  • DriverManager.getConnection에 "적절한 드라이버가 없습니다"라는 오류가 표시됩니다.

    드라이버가 등록되어 있고 JDBC 드라이버와 일치하는 접속 URL을 사용하는지 확인합니다. 올바른 값은 Using Oracle's JDBC Drivers를 참조하십시오.

  • 오류 메시지: "OCI 드라이버에서 UnsufficientLinkError가 발생했습니다."

    Win NT나 Win95를 사용할 경우, Java Virtual Machine은 OCI73JDBC.DLL이 호출한 DLL 중 하나를 로드할 수 없을 때 OCI73JDBC.DLL을 로드할 수 없다고 표시합니다. JDBC OCI 드라이버는 드라이버의 C 코드 부분이 있는 공유 라이브러리를 사용합니다. 라이브러리는 Oracle7 클라이언트 프로그램용 OCI73JDBC.DLL입니다. 일반적으로 공유 라이브러리는 배포판에서 JDBC 드라이버를 설치할 때 [ORACLE_HOME]\BIN에 설치됩니다. 해당 디렉토리가 경로에 있는지 확인합니다. 자세한 내용은 문서의 설치 섹션을 참조하십시오.

    공유 라이브러리는 다른 라이브러리에도 종속됩니다. 해당 DLL 중 하나라도 누락되면 OCI73JDBC.DLL이 없다는 오류가 표시됩니다. JDBC OCI7에 필요한 Oracle7 파일: CORE35.DLL, CORE35O.DLL, NLSRTL32.DLL, ORA73.DLL

    Java Virtual Machine(JavaSoft JDK)은 JAVAI.DLL입니다.

    Microsoft Visual C++ 런타임은 MSVCRT.DLL, MSVCRTI.DLL, MSVCRT20.DLL, MSVCRT40.DLL입니다.

    Windows Explorer 프로그램으로 이동하여 DLL을 마우스 오른쪽 버튼으로 클릭하고 Quick View(빨리 보기)를 선택하면 종속된 DLL의 목록을 찾을 수 있습니다. Quick View(빨리 보기) 화면에 표시되는 정보 중에는 종속된 DLL이 나열된 Import Table(가져오기 테이블)이 있습니다. Oracle 설치 CD에서 누락된 필수 지원 파일을 다시 설치할 수 있습니다. "Required Support Files 7.3.4", "SQL*Net Client 2.3.4"와 "Oracle TCP/IP Protocol Adapter 2.3.4"c를 설치하십시오.

  • 오류 메시지: "ORA-1019: 메모리를 할당할 수 없습니다."

    Oracle7 클라이언트 설치에서 OCI8 드라이버를 사용하고 있습니다. OCI7 드라이버를 사용해 주십시오.

  • 오류 메시지: "ORA-01000: 열린 커서 최대치 초과"

    접속에서 클라이언트 하나가 한 번에 열 수 있는 커서 수는 제한(기본값은 50)되어 있습니다. 커서를 닫고 해제하려면 stmt.close() 메서드를 사용하여 명령문을 명시적으로 닫아야 합니다.

    해당 커서를 명시적으로 닫지 않으면 결국 이 오류가 발생합니다. 간단히 "OPEN_CURSORS" 제한을 늘려서 단기적으로 문제를 방지할 수 있지만, 문제를 숨길 뿐 해결하지는 못하는 방안입니다. 더 이상 필요하지 않은 커서를 명시적으로 닫는 책임은 사용자에게 있습니다.

  • 오류 메시지: "ORA-01002: 인출 순서 잘못됨"

    JDBC Connection은 기본적으로 자동 커밋이 ON으로 설정되어 있습니다. 그러나 '업데이트 대상(for update)'이 있는 SQL을 사용하려면 자동 커밋을 OFF로 설정해야 합니다.

    따라서 자동 커밋을 false로 설정하면 문제를 해결할 수 있습니다.

  • 오류 메시지: "ORA-12705: 잘못되었거나 알 수 없는 NLS 매개변수 값이 지정됨"

    NLS_LANG을 명시적으로 설정해 봅니다. NLS_LANG이 설정되어 있지 않거나 올바르게 설정되어 있으면 Oracle 7.3.4가 아닌 클라이언트가 있을 수 있습니다. 클라이언트에 Oracle7.3.4를 설치하십시오.

  • 오류 ORA-12705에 대한 텍스트를 검색하는 동안 오류가 발생했습니다.

    클라이언트에 Oracle 설치가 없거나 설치가 제대로 완료되지 않았습니다. 아직 "Oracle Client" 설치를 하지 않았다면 일반 Oracle Server 설치 CD로 "Oracle Client" 설치를 진행하여 클라이언트 시스템에 필요한 소프트웨어를 설치하십시오. 이미 설치를 완료한 경우, 설치가 제대로 완료되었는지 확인하고 필요하다면 제거하고 다시 설치합니다.

    클라이언트 설치를 수행한 다음 ORACLE_HOME을 설정하지 않으면 이 오류가 발생할 수 있습니다. ORACLE_HOME 환경 변수가 없는 경우, 클라이언트 측을 다시 설치할 필요 없이 해당 환경 변수를 설정/내보내기만 하면 문제가 해결됩니다.

  • 오류 메시지: JDBC Thin Driver에서 유니코드 리터럴에 "잘못된 문자" 오류가 발생했습니다.

    JDBC Thin 드라이버에서는 유니코드 문자를 포함하는 리터럴을 큰따옴표로 묶어야 합니다. 예:

    ResultSet rset = stmt.executeQuery ("select * from \"\u6d82\u6d85\u6886\u5384\"");

  • INSERT 또는 UPDATE 작업이 느립니다.

    기본적으로 드라이버는 명령문을 실행하는 즉시 모든 INSERT와 UPDATE를 커밋합니다. JDBC에서는 이 기능을 자동 커밋 모드라고 합니다. 자동 커밋을 해제하고 명시적인 커밋 문을 사용하면 성능을 향상할 수 있습니다. Connection 클래스의 setAutoCommit 진입점을 사용하여 자동 커밋을 해제하십시오.

    connection.setAutoCommit(false); INSERT와 UPDATE 호출을 일괄 처리하는 Oracle 확장에 대한 자세한 내용은 JDBC Documentation의 Batching Updates를 참조하십시오. 이 명령을 일괄 처리하면 자동 커밋을 해제하는 것보다 속도가 훨씬 더 향상됩니다.

  • 오류 메시지: "피어가 접속을 다시 설정했습니다."

    일반적으로 이 오류는 서버에 접속된 상태에서 서버가 중단되는 경우에 표시됩니다. 접속을 설정하는 중이거나 접속을 설정하고 진행하는 과정일 수도 있습니다. 두 상황 중 어느 쪽이든 서버에 발생한 오류와 스택 덤프를 서버 측 로그 파일을 통해 확인해야 합니다.

    이 오류는 잘못된/유효하지 않은 포트나 시스템에 접속하려 할 때 발생하는 오류와는 다릅니다. 서버가 다운되어 접속 요청을 수락하지 않을 때 발생하는 오류와도 다릅니다.

  • "프로토콜 위반"은 무엇을 의미합니까?

    Thin 드라이버가 RDBMS에서 예상치 못한 항목을 읽으면 이 예외가 발생합니다. 이는 Thin 드라이버의 프로토콜 엔진과 RDBMS의 프로토콜 엔진이 동기화되지 않았음을 시사합니다. 이 오류에서 복구하는 방법은 없습니다. 접속이 끊어졌습니다. 종료하려고 노력할 테지만, 실패할 확률이 높습니다.

    이 오류를 재현할 수 있는 테스트 사례가 있다면 오라클 글로벌 지원 서비스에 TAR을 제출해 주십시오. 패치를 포함하여 JDBC 드라이버와 RDBMS의 버전 번호를 정확하고 구체적으로 명시해주시길 바랍니다.

데모 프로그램

  • JDBC 데모 프로그램이 있습니까?

    예. UNIX 시스템에서는 $ORACLE_HOME/jdbc/demo/demo.tar을, Windows 시스템에서는 $ORACLE_HOME/jdbc/demo/demo.zip을 찾으시면 됩니다.

  • 데모를 실행하려면 어떻게 해야 합니까?

    demo.tar 또는 demo.zip 파일의 압축을 풉니다. Samples-Readme.txt 파일을 확인할 수 있습니다. 먼저 이 파일을 읽고 JDBC 데모의 개요를 숙지한 다음 UNIX에서는 Makefile, Windows에서는 rundemo.bat를 호출합니다.

  • 데모를 실행할 때 오류가 발생하면 어떻게 해야 합니까?

    JDBC 데모는 오류 없이 실행되어야 합니다. 오류 메시지가 표시되었다면 구성에 문제가 있는 상황일 수 있습니다. 확인할 사항:

    • 클래스 경로
    • 올바른 JDK 버전
    • 사전 테스트 요구 사항은 Samples-Readme.txt, Makefile, 및 각 .java 파일을 참조하십시오.

Oracle JDBC Trace Facility

  • JDBC Trace Facility란?

    JDBC Trace Facility는 이전 버전의 Oracle JDBC에 내장된 런타임 디버깅 보조 기능입니다. 사용으로 설정하면 Oracle JDBC 드라이버 실행에 대한 메시지를 인쇄합니다. 일반적으로 이러한 메시지에는 메소드 진입, 매개변숫값, 중요 내부 상태, 내부 오류, 메소드 종료 및 반환 값이 포함됩니다.

    10.1.0부터 Oracle Trace Facility는 classes12_g.jar 및 classes12dms_g.jar에서만 지원됩니다. JDK 1.4 이상을 지원하는 모든 Oracle JDBC 드라이버는 java.util.logging에 내장된 추적 기능을 사용합니다. JDBC 11, ojdbc14_g.jar 또는 ojdbc14dms_g.jar 사용 시 추적 정보를 얻는 방법에 대한 정보는 java.util.logging 섹션을 참조하십시오.

    JDBC 애플리케이션에 문제가 있을 때는 추적 기능이 도움이 될 수 있습니다. 내부 JDBC 메서드에 관한 메시지가 대부분이므로 이해하기 힘들 수 있습니다. 그래도 유용한 정보를 찾을 수 있습니다. 우선 추적 볼륨을 1로 설정하는 것이 좋습니다.

    오라클은 JDBC에 버그가 있다고 생각하는 사용자를 지원하는 데 추적 정보를 활용할 수 있습니다. 이 경우 추적 볼륨을 기본값으로 둡니다. 이를 통해 생성되는 출력량이 상당하므로 소량의 테스트 사례만 추적하거나 애플리케이션의 제한된 일부분만 추적해야 합니다. 오류가 발생하기 전에 적절한 코드를 포함하도록 합니다.

  • 이전 JDBC 추적을 사용하려면 어떻게 해야 합니까?

    JDBC 11 사용 시 추적 정보를 얻는 방법에 대한 정보는 java.util.logging 섹션을 참조하십시오.

    JDBC Trace Facility를 사용하려면 디버그 JAR 파일(classes12_g.jar 또는 class12dms_g.jar)을 사용해야 합니다. 다른 JAR 또는 ZIP 파일을 사용하는 동안 추적을 사용하려고 하면 오류 메시지가 표시되거나 아무것도 출력되지 않습니다.

    추적은 프로그래밍 방식이나 속성, 이 두 가지로 제어할 수 있습니다. 프로그래밍 방식 API를 사용하면 애플리케이션이 실행되는 동안 추적을 사용 또는 사용 안 함으로 설정하고 다른 속성을 변경할 수 있습니다. 추적 데이터는 양이 많은 경우가 대부분이므로 특히 의심스러운 코드에만 추적을 활성화하는 것이 좋습니다. 애플리케이션 소스를 변경하기가 쉽지 않으면 속성을 통해 추적을 제어할 수 있습니다 이러한 속성은 애플리케이션을 시작할 때 한 번만 읽고 다시 읽지 않습니다. 속성과 API를 동시에 사용할 수 있습니다. 속성으로 초기 상태를 설정하고 API로 설정한 초기 상태를 수정합니다.

    프로그래밍으로 추적을 설정할 때는 다음을 호출하는 것이 가장 간단합니다.

    oracle.jdbc.driver.OracleLog.startLogging(); 이렇게 하면 추적이 System.out으로 전송됩니다. 호출을 끄려면 다음을 사용합니다.

    oracle.jdbc.driver.OracleLog.stopLogging(); 시스템 속성 oracle.jdbc.Trace"true"로 설정하여 추적을 켤 수도 있습니다. java -Doracle.jdbc.Trace=true MyApp 아래에 설명된 다른 JDBC Trace Facility 속성을 설정하면 oracle.jdbc.Trace가 암시적으로 "true"로 설정됩니다.

  • 추적 출력의 볼륨을 제어하려면 어떻게 해야 합니까?

    JDBC 11 사용 시 추적 정보를 얻는 방법에 대한 정보는 java.util.logging 섹션을 참조하십시오.

    JDBC Trace Facility로 인해 출력이 대량으로 생성될 수 있습니다. 가장 간단한 볼륨 제어 방법은 필요할 때만 추적을 켜는 것입니다.

    oracle.jdbc.driver.OracleLog.startLogging(); myApp.suspectCode();

    oracle.jdbc.driver.OracleLog.stopLogging(); 사용할 수 없는 경우가 많습니다. 추적 볼륨을 설정하여 추적 메시지 수를 줄일 수도 있습니다. oracle.jdbc.driver.OracleLog.setLogVolume(1); 기본값은 2입니다. 최댓값은 3이지만 현재로서는 2보다 훨씬 더 많은 양을 생성하지 않습니다. 1은 기본값보다 훨씬 적습니다.

    줄 크기를 명시적으로 설정하거나 각 줄에 인쇄되는 필드를 변경하여 줄별 크기를 제어할 수 있습니다. 최대 줄 길이를 변경하려면 다음을 사용합니다.

    oracle.jdbc.driver.OracleLog.setMaxPrintBytes(100); or java -Doracle.jdbc.MaxPrintBytes=100 MyApp

    인쇄되는 필드를 제어하려면 oracle.jdbc.PrintFields 속성을 설정하면 됩니다.

    java -Doracle.jdbc.PrintFields=none MyApp 올바른 값:

    • 없음(none)--메시지만 인쇄
    • 기본값(default)
    • 스레드(thread)--기본값과 같으나 스레드 이름이 추가됨
    • 모두(all)
  • 추적 출력은 어디에 있습니까?

    JDBC 11 사용 시 추적 정보를 얻는 방법에 대한 정보는 java.util.logging 섹션을 참조하십시오.

    기본적으로 추적 출력은 System.out으로 보내집니다. 다른 위치로 보내려면 속성: oracle.jdbc.LogFile

    java -Doracle.jdbc.LogFile=/tmp/jdbc.log MyApp을 활용하거나setLogStream api. oracle.jdbc.driver.OracleLog.setLogStream(System.err)을 호출하면 됩니다. 로그 스트림을 설정하면 추적도 시작됩니다. 로그 스트림을 null로 설정하여 추적을 해제할 수 있습니다.

  • DMS를 사용하는 JAR의 DMS를 해제하려면 어떻게 해야 합니까?

    시스템 속성에 oracle.dms.console.DMSConsole이 있습니다. 이 속성이 설정되어 있지 않다면 DMS가 활성 상태입니다. oracle.dms.instrument_stub.DMSConsole로 설정되어 있으면 DMS를 사용하지 않도록 설정하는 데 효과적인 스텁 구현을 사용합니다. 다음을 호출해서 애플리케이션이 DMS를 사용하지 않도록 설정하는 방법도 있습니다.

    System.setProperty( "oracle.dms.console.DMSConsole", "oracle.dms.instrument_stub.DMSConsole"). DMS 코드를 실행하기 전에 호출해야 합니다. Java VM에서 -D 옵션을 사용할 수도 있습니다. java -Doracle.dms.console.DMSConsole=oracle.dms.instrument_stub.DMSConsole MyApp

개발 툴 및 프로세스

  • Symantec Visual Cafe를 사용하여 JDBC 프로그램을 디버깅할 수 있습니까?

    Visual Cafe는 더 이상 지원되지 않습니다.

  • Microsoft Visual J++로 JDBC 프로그램을 디버깅할 수 있습니까?

    Visual J++는 더 이상 지원되지 않습니다.

지원되는 기능

  • JDBC 드라이버가 PL/SQL 저장 프로시저에 액세스할 수 있습니까?

    예, Oracle JDBC OCI Driver와 Thin JDBC Driver 모두 PL/SQL 저장 프로시저 실행과 익명 블록 실행을 지원합니다. SQL:2003 이스케이프 구문과 Oracle 이스케이프 구문을 모두 지원합니다. 두 Oracle JDBC Driver 모두 PL/SQL 호출을 제공합니다.

    • SQL:2003 Syntax CallableStatement cs1 = conn.prepareCall ("{call proc (?,?)}"); CallableStatement cs2 = conn.prepareCall ("{? = call func (?,?)}");
    • Oracle Syntax CallableStatement cs1 = conn.prepareCall ("begin proc (:1,:2); end;"); CallableStatement cs2 = conn.prepareCall ("begin :1 := func (:2,:3); end;");
  • JDBC 드라이버는 스트리밍을 지원합니까?

    예, Oracle JDBC OCI Driver와 Thin JDBC Driver 모두 클라이언트와 서버 간 양방향 데이터 스트리밍을 지원합니다. 바이너리, ASCII, 유니코드를 비롯해 모든 스트림 변환을 지원합니다. 자세한 내용은 Oracle JDBC Driver 문서의 스트림 자습서를 참조하십시오.

  • JDBC Driver는 멀티바이트 문자세트를 지원합니까?

    예, Oracle JDBC OCI Driver와 Thin JDBC Driver 모두 멀티바이트 문자세트를 지원합니다. 둘 다 모든 Oracle 문자세트를 사용하는 데이터베이스에 액세스할 수 있습니다. 멀티바이트 문자는 유니코드 1.2로 변환됩니다. JDBC OCI 드라이버는 테스트를 거쳤으며 모든 유럽 문자 세트와 중국어, 일본어, 한국어를 비롯한 모든 아시아 문자 세트를 지원합니다.

  • JDBC 드라이버는 방화벽이 있어도 작동합니까?

    예, JDBC OCI Driver와 Thin JDBC Driver 모두 인트라넷과 엑스트라넷 환경에서 작동할 수 있습니다. 엑스트라넷에 배포한 드라이버는 SQL*Net 인증을 받은 업계 최고의 방화벽 대다수와 호환됩니다. 현재 SQL*Net 인증된 방화벽을 공급하는 업체는 다음과 같습니다.

    • 상태 기반 검사 방화벽: Checkpoint, SunSoft 및CISCO Systems의 방화벽
    • 프록시 기반 방화벽: Milkyway Networks, Trusted Information Systems, Raptor, Secure Computing Corporation 및 Global Internet의 방화벽
  • Oracle의 JDBC 드라이버는 PL/SQL 테이블/결과 집합/레코드/부울을 지원합니까?

    아니요, Oracle JDBC 드라이버는 PL/SQL 유형 TABLE(이제 index-by 테이블이라고 함), RESULT SET, RECORD 또는 BOOLEAN의 호출 인수나 반환 값을 지원하지 않습니다. 지원하도록 변경할 계획은 현재 없습니다. 대신 RefCursor, Oracle Collections, Structured Object Type을 사용하는 것이 좋습니다.

    데이터를 JDBC에서 지원하는 유형으로 처리하는 래퍼 프로시저를 만들어 임시해결책으로 쓸 수 있습니다.

    예를 들어 PL/SQL 부울을 사용하는 저장 프로시저를 래핑하려면 JDBC에서 문자나 숫자를 가져와서 원래 프로시저에 BOOLEAN으로 전달하거나, 원래 프로시저에서 BOOLEAN 인수를 출력 매개변수로 받아 JDBC에 CHAR이나 NUMBER로 전달하는 저장 프로시저를 만들 수 있습니다. 마찬가지로 PL/SQL 레코드를 사용하는 저장 프로시저를 래핑하려면 개별 구성 요소(예: CHAR 및 NUMBER)에서 레코드를 처리하는 저장 프로시저를 만들면 됩니다. PL/SQL 테이블을 사용하는 저장 프로시저를 래핑하려면 데이터를 구성 요소로 나누거나 Oracle 컬렉션 유형을 사용하면 됩니다.

    다음은 Boolean을 입력으로 받는 저장 프로시저인 PROC의 PL/SQL 래퍼 프로시저 MY_PROC의 예입니다.

    PROCEDURE MY_PROC (n NUMBER) IS BEGIN IF n=0 THEN proc(false); ELSE proc(true); END IF; END; PROCEDURE PROC (b BOOLEAN) IS BEGIN ... END;

  • 복구(failover)는 지원됩니까?

    예. RAC 서버에 접속할 때 빠른 접속 복구Fast Connection Failover를 사용하면 장애 이벤트에 신속하게 대응할 수 있습니다. 이 새로운 고가용성 기능은 드라이버 독립적이며 암시적 연결 캐시 및 RAC와 함께 작동하여 캐시에서 접속 가용성을 최대화합니다. RAC의 다운 이벤트를 처리하여 유효하지 않은 접속을 제거하고 업 이벤트를 처리하여 기존 접속의 부하를 분산하는 방식으로 이뤄집니다.

    OCI 드라이버를 사용 중이고 쿼리 복구만 필요하다면 TAF를 사용해볼 수 있습니다. TAF는 주로 애플리케이션의 쿼리 복구를 도와줍니다. 일반적인 복구 메커니즘이 아닙니다. 빠른 접속 복구와 TAF를 동시에 사용할 수는 없습니다. 한 번에 하나만 설정하여 사용할 수 있습니다.

  • JDBC 드라이버는 Oracle ROWID 데이터 유형을 어떻게 지원합니까? 이 내용이 getCursorName 및 setCursorName과 어떤 관련이 있습니까?

    getCursorName 및 setCursorName JDBC 진입점은 지원되지 않습니다. 대신 유사한 기능을 제공하는 ROWID를 사용할 수 있습니다. JDBC 4.0은 oracle.sql.ROWID와 완전히 호환되고 JSE 6(ojdbc6.jar) 드라이버에서 지원되는 java.sql.Rowid를 정의합니다.

    ROWID 의사 열을 쿼리에 추가하면 ResultSet getString 진입점을 사용하여 JDBC에서 검색할 수 있습니다. setString 진입점을 사용하여 ROWID를 readyStatement 매개변수에 바인딩할 수도 있습니다.

    이렇게 하면 다음 예와 같이 내부 업데이트를 할 수 있습니다.

    ResultSetMetaData 클래스에서 ROWID를 포함하는 열은 값이 -8인 oracle.jdbc.driver.OracleTypes.ROWID 유형으로 보고됩니다.

  • JDBC 드라이버는 Oracle REFCURSOR 데이터 유형을 어떻게 지원합니까?

    Oracle JDBC 드라이버는 REFCURSOR 유형의 바인드 변수를 지원합니다. REFCURSOR는 JDBC ResultSet으로 표시됩니다. CallableStatement의 getCursor 메서드를 사용하여 PL/SQL 블록에서 반환된 REFCURSOR 값을 ResultSet으로 변환할 수 있습니다. JDBC를 사용하면 쿼리를 실행하고 결과 집합을 반환하는 저장 프로시저를 호출할 수 있습니다. getCursor 메서드를 사용하려면 해당 CallableStatement를 oracle.jdbc.driver.OracleCallableStatement로 캐스팅합니다.

  • ANO는 JDBC 드라이버와 호환됩니까?

    버전 9.2부터 OCI와 Thin 드라이버 모두 ANO를 지원합니다.

    ANO는 8.0.X OCI 드라이버 버전 8.0.x 이상에서 작동합니다. 이 기능이 제대로 작동하려면 8.0.4, 8.0.5 및 8.0.6용 최신 패치 세트가 있어야 합니다.

    참고: 8.1.5와 8.1.6sdk에는 알려진 버그(#899424)가 있습니다. 이에 대한 버그 수정 사항이 있기는 하지만, 백포트하여 모든 이전 릴리스에 적용할 수 있는 패치로 릴리스되기 전입니다. 이 버그는 아직 8.1.5와 8.1.6sdk에 남아 있습니다.

    8.1.6 코드에는 버그 수정 사항이 이미 있으므로 8.1.6에는 패치가 필요하지 않습니다. 코드가 제대로 작동해야 합니다. 자세한 내용은 버그 #899424를 참조하십시오.

  • oracle.sql.* 데이터 유형을 직렬화할 수 있습니까?

    예. SQL 데이터 유형을 나타내는 oracle.sql.* 클래스는 모두 직렬화할 수 있습니다.

  • JDBC Driver는 Object나 Collection을 지원합니까?

    예, Oracle JDBC 드라이버는 Object와 Collection을 지원합니다. 8.1.5부터 지원되었습니다.

  • WaitOption과 AutoRollback을 사용할 수 있습니까?

    호출 일괄 처리를 위한 WaitOption 및 AutoRollback 롤백 옵션은 더 이상 사용하지 않습니다. 다음 메서드는 더 이상 사용할 수 없습니다.

    public void setAutoRollback (int autoRollback); public int getAutoRollback(); public void setWaitOption(int waitOption); public int getWaitOption();

  • Java 저장 프로시저가 다른 데이터베이스의 인스턴스에 대한 접속을 열 수 있습니까?

    예, Thin 서버 드라이버를 사용하면 가능합니다. 8.1.6sdk부터 지원되었습니다.

    현재 알려진 유일한 해결 방법은 첫 번째 설치가 두 번째 설치에 접속할 때 DBINKS를 사용하도록 첫 번째 설치를 구성하는 것입니다. JDBC 드라이버가 계속 같은 인스턴스에서 작동 중이라고 인식하도록 가장하고 DBLINKS를 사용하여 세부 사항을 처리합니다. 그러나 MTS 서버 설치에서 DBLINKS를 사용하는 데 문제가 있을 수 있습니다.

성능

  • Thin 드라이버와 OCI 드라이버 중 어느 것이 더 빠릅니까?

    늘 그렇듯 상황에 따라 다릅니다. Thin 드라이버에서 더 빠른 애플리케이션도 있고 OCI 드라이버에서 더 빠른 애플리케이션도 있습니다. 10.1.0 기준으로 Thin 드라이버가 OCI 드라이버보다 약간 더 빠른 듯합니다. 클라이언트와 서버가 같은 유형의 하드웨어와 OS인 경우, Thin 클라이언트가 더 빠르더라도 OCI 드라이버의 부하가 약간 줄어듭니다. 차이는 보통 10% 미만으로 크지 않습니다. 고객 대부분은 관리하기 쉽다는 이유로 Thin 드라이버를 사용합니다. 마일리지는 다를 수 있습니다.

  • Statement와 PreparedStatement 중 어느 것이 더 빠릅니까?

    SQL을 한 번만 실행하는 경우에는 Statement가 약간 더 빠를 수 있습니다. SQL을 두 번 이상 실행할 때는 PreparedStatement가 훨씬 빠릅니다. 명령문 캐시를 사용하는 경우(사용해야 함), 캐시에서 명령문을 가져오면 해당 명령문을 실행하는 것과 다를 바 없습니다.

    일반적으로 PreparedStatements를 사용하는 것이 좋습니다. SQL에서 사용자 제공 데이터를 보내는 경우에는 더더욱 PreparedStatement를 사용해야 합니다. 데이터를 PreparedStatement 매개변수에 바인딩하면 대부분의 SQL 삽입 공격을 방지할 수 있습니다. Statement를 사용해도 성능에 영향을 거의 주지 않습니다.

java.util.logging

  • java.util.logging를 사용하여 Oracle JDBC 드라이버에서 추적 출력을 가져오려면 어떻게 해야 합니까?

    첫째, 로깅 코드를 포함하는 JAR 파일을 사용해야 합니다. JDBC 드라이버 ojdbc8.jar에는 로깅 코드가 포함되어 있지 않습니다. 비(非)디버그 DMS JAR 파일인 ojdbc8dms.jar에는 로깅 코드가 일부 포함되어 있습니다. 디버그 JAR 파일(*_g.jar)에는 대량의 로깅 코드가 포함되어 있습니다. 클래스 경로에 다른 Oracle JDBC JAR 파일이 없는지 확인하십시오.

    둘째, Oracle JDBC 로깅을 사용하도록 설정합니다. 시스템 속성을 설정(-Doracle.jdbc.Trace=true)하여 로깅 사용을 전역으로 설정하거나 Oracle JDBC Diagnosibility MBean을 사용하여 프로그래밍 방식으로 제어할 수 있습니다.

    // create name 
    javax.management.ObjectName name = new javax.management.ObjectName("com.oracle.jdbc:type=diagnosibility,name=*"); 
    // get the MBean server 
    javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer(); 
    // find out if logging is enabled or not 
    System.out.println("LoggingEnabled = " + mbs.getAttribute(name, "LoggingEnabled")); 
    // enable logging 
    mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", true)); 
    // disable logging 
    mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", false));

    로깅을 사용 설정하기만 해도 출력이 최소화됩니다. 더 상세하고 대상이 분명한 출력을 얻으려면 java.util.logging를 구성해야 합니다.

  • Oracle JDBC에서 유용한 추적 출력을 얻으려면 java.util.logging를 어떻게 구성합니까?

    JDBC 코드는 다양한 로거를 만듭니다. 특별한 출력을 원한다면 로거별로 logLevel을 설정하고 핸들러를 추가해야 합니다. 자세한 내용은 java.util.logging의 JavaDoc을 참조하십시오.

    또는 Oracle JDBC 드라이버 설치의 포함된 demo.zip 파일에서 제공하는 편리한 속성 파일 OracleLog.properties를 사용할 수 있습니다. 파일에 있는 주석에서 사용 방법을 확인할 수 있습니다. 훨씬 간단하므로 이 방식을 사용하는 것이 좋습니다.

    두 경우 모두 추적 출력을 얻으려면 로깅을 사용하도록 설정해야 합니다. 로거를 다시 구성하지 않고도 추적 출력을 설정/해제할 수 있습니다. Diagnosibility MBean은 로거에 아무런 영향을 주지 않습니다. MBean을 호출하도록 소스를 변경하지 않으려면 Java 실행 명령에 -Doracle.jdbc.Trace=true를 추가하면 됩니다. 이 경우, 실행 전체가 기록됩니다.

    JDBC 로깅 구성에 대한 자세한 내용은 JDBC 로깅 백서를 참조하십시오. 힌트: Level을 INFO로 설정하면 실행되는 SQL이 기록되고, FINE으로 설정하면 모든 public 메서드의 시작 및 종료가 기록되며, FINE보다 큰 값으로 설정하면 디스크 공간이 로그 파일로 꽉 차게 됩니다. 주의하시는 것이 좋습니다.

  • Server-Side Internal(서버 측 내부) 드라이버는 어떻게 구성해야 합니까?

    Server-Side Internal(서버 측 내부) 드라이버는 추적 출력에 java.util.logging를 사용합니다. 다음을 실행하면 서버에서 간편하게

    OracleLog.properties 파일을 사용할 수 있습니다.

    System.setProperty("java.util.logging.config.file", "OracleLog.properties")

    OracleLog.properties$ORACLE_HOME에 넣습니다.