오라클 JDBC 드라이버 소개
오라클 JDBC 드라이버란 무엇인가?
JDBC 는 자바 프로그램이 테이블형태의 데이터소스를 액세스할 수 있는 API이다. JDBC 인터페이스를 사용하여 자바 프로그램에서 오라클 데이터베이스와 상호 동작할 수 있도록 오라클은 오라클 JDBC 드라이버를 제공한다.
오라클에서 제공하는 JDBC 드라이버 타입
오라클은 4가지 타입의 드라이버를 제공한다:
- JDBC Thin client-side driver (Thin driver):
오라클 JDBC Thin 드라이버는 JDBC 타입 4 드라이버(순수 자바로 되어있는)이다. JDBC Thin 드라이버는 오라클 서버로 직접 접속시 자바 소켓을 사용한다. JDBC Thin 드라이버는 오라클 SQL*NET/NET8의 TCP/IP 버전을 구현하여 제공한다. 순수 자바로 구현되어 있기 때문에 플랫폼에 독립적이다.
Thin 드라이버는 클라이언트쪽 사용을 위한 것이고 클라이언트쪽에 오라클 소프트웨어가 필요하지 않다.
- JDBC OCI client-side driver (OCI driver):
오라클 JDBC OCI 드라이버는 오라클 데이터베이스와 동작할 수 있도록 OCI(Oracle Call Interface)를 사용하여 JDBC 인터페이스를 구현한 JDBC 타입 2(네이티브 API, 일부 자바)이다. JDBC OCI 드라이버는 OCI 라이브러리에서 C 엔트리 포인트를 호출하기 위해 네이티브 메소드를 사용하기 떄문에 플랫폼에 의존적이다. Net8을 포함하여 오라클 클라이언트(또는 인스턴트 클라이언트) 설치가 필요하다.
JDBC OCI 드라이버 인터페이스는 OCI를 통해서 오라클 데이터베이스와 인터페이스하기 때문에 모든 오라클 데이터베이스 버전과 호환가능하고 IPC, named pipe, TCP/IP 및 SPX/IPX를 포함하여 설치된 Net8 아답터 모두 호환가능하다.
- JDBC server-side Internal driver (KPRB driver):
이 JDBC 타입 2 드라이버는 자바 스토어드 프로시저와 같은 오라클 데이터베이스 서버 JVM 안에서 수행되는 자바코드에 의해서 사용된다. JDBC 서버 드라이버는 자바 프로그램이 내부 SQL 엔진과 통신하거나 내부 데이터베이스 오브젝트 액세스 가능하도록 한다.
- JDBC Thin server-side driver:
이 JDBC 타입 4 드라이버는 오라클 데이터베이스 서버 JVM에서 수행되는 자바프로그램이 리모트 데이터베이스를 액세스 가능하도록 한다.
오라클 JDBC 드라이버는 어떤것들이 있는가?
오라클 JDBC 드라이버는 오라클 데이터베이스 서버와 함께 제공된다.
데이터 베이스 9.2.0.1 버전부터, 오라클 JDBC 드라이버 버전들은 다음과 같다 :
- JDBC 9.2.0.X
- JDBC 10.1.0.X
- JDBC 10.2.0.X
- JDBC 11.1.0.X
- JDBC 11.2.0.X
- JDBC 12.1.0.X
- JDBC 12.2.0.X
- JDBC 18C
- JDBC 19C
- JDBC 21C
- JDBC 23C
지원되는 JDBC 드라이버 버전은 23C, 21C, 18C, 19C, 12.2 및 12.1(지원은 되지만 fix는 Extended Support가 있는 경우만 가능)입니다.
제공되는 지원 버전 및 수준에 대한 업데이트는 Oracle 평생 지원 정책을 참조하십시오.
주요 오라클 JDBC 드라이버 자바 클래스 라이브러리들은 무엇인가?
애플리케이션의 CLASSPATH에 포함되는 기본 자바 라이브러리들은 ojdbc11.jar, ojdbc10.jar, ojdbc8.jar, ojdbc7.jar, ojdbc6.jar, ojdbc5.jar, ojdbc14.jar 또는 classes12.jar이다.
일부 버전에서는 JDBC가 여러 JDK 버전을 지원한다('JDK 버전과 JDBC 드라이버 버전 호환성' 섹션 참조).
만일 애플리케이션에서 고급 데이터 타입(객체)를 사용하는 경우 nls_charset12.jar 또는 orai18n.jar 라이브러리가 CLASSPATH에 추가되어야 한다.
java.sql.SQLXML와 같은 SQL/XML 데이타베이스 타입을 사용할 경우, xdb6.jar 라이브러리가 애플리케이션 CLASSPATH에 추가되어야 한다.
JDBC OCI 네이티브 공유 라이브러리란 무엇인가 ?
네이티브 JDBC OCI 라이브러리는 :
N 이 9인 경우 JDBC 9.x.x 드라이버용
N 이 10인 경우 JDBC 10.x.x 드라이버용
N 이 11인 경우 JDBC 11.x.x 드라이버용
N 이 12인 경우 JDBC 12.x.x 드라이버용
N 이 18인 경우 JDBC 18.x.x 드라이버용
N 이 19인 경우 JDBC 19.x.x 드라이버용
N 이 21인 경우 JDBC 21.x.x 드라이버용
N 이 23인 경우 JDBC 23.x.x 드라이버용
공유 라이브러리는 데이터베이스를 액세스하기 위한 OCI 인터페이스로 불린다. 따라서 JDBC OCI 드라이버를 사용할때 윈도우의 경우 PATH 환경변수 또는 솔라리스의 경우 LD_LIBRARY_PATH 환경변수에 포함되어야 한다.
OCI 공유 라이브러리는 자바프로그램이 구동되는 JVM 타입과 매치되어야한다. 32 bit (/64 bit) JVM 은 32 bit (/64 bit) OCI 공유 라이브러리와 매칭되어야 한다.
JDK 버전과 JDBC 드라이버 버전 호환성
JDBC FAQ on Oracle Technology Network (OTN) 에서, OCI 드라이버 또는 Thin JDBC 드라이버 버전이 다음 JDK 버전을 지원하는 것을 확인할 수 있다 :
JDBC Version |
JDK version |
JDBC File Name |
23c |
8.x 11.x 12.x 13.x 14.x 15.x 17.x |
ojdbc8.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc11.jar |
21c |
8.x 11.x 12.x 13.x 14.x 15.x 17.x |
ojdbc8.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc8.jar, ojdbc11.jar ojdbc11.jar ojdbc11.jar |
19c |
8.x 9.x 10.x 11.x 17.x |
ojdbc8.jar ojdbc8.jar ojdbc10.jar ojdbc8.jar, ojdbc10.jar *** ojdbc8.jar, ojdbc10.jar |
18c |
8.x 9.x 10.x 11.x |
ojdbc8.jar |
12.2.0 |
8.x |
ojdbc8.jar |
12.1.0 |
8.x 7.x 6.x |
ojdbc7.jar ojdbc7.jar ojdbc6.jar |
11.2.0 |
8.x ** 7.x ** 6.x 5.x |
ojdbc6.jar ojdbc6.jar ojdbc6.jar ojdbc5.jar |
11.1.0 |
6.x 5.x |
ojdbc6.jar ojdbc5.jar |
10.2.0 |
1.2.x 1.3.x 1.4.x 5.x |
classes12.jar classes12.jar ojdbc14.jar ojdbc14.jar |
10.1.0
|
1.2.x 1.3.x 1.4.x |
classes12.jar classes12.jar ojdbc14.jar |
9.2.0 |
1.1.x 1.2.x 1.3.x 1.4.x |
classes111.zip* classes12.zip* classes12.zip* ojdbc14.jar |
* 9.2.0.7.0 버전부터 zip 파일들이 jar 파일로 변경되었다.
** 오라클 JDBC 드라이버 11.2.0.3 (와 그이상) 버전만 JDK 7과 JDK 8를 지원.
예시:
- JDK 버전이 6.0.x인 경우, 11.2 JDBC 버전 사용시, 사용 가능한 JDBC 라이브러리는 ojdbc6.jar 파일이다.
- JDK version is 5.0.x, 10.2 JDBC 버전 사용시, 사용 가능한 JDBC 라이브러리는 ojdbc14.jar 파일이다.
*** 19C 버전은:
(a) ojdbc8.jar (JDK8 (JDBC 4.2) 에서 컴파일 되었으며 JDK9,JDK11와 사용 가능하다)
(b) ojdbc10.jar (JDK10 (JDBC 4.3) 에서 컴파일 되었으며 JDK11와 사용 가능하다).
JDK11을 사용하는 경우 ojdbc8.jar은 4.3 기능을 모두 포함하므로 더 나은 선택입니다. ojdbc10.jar은 표준 Java SE를 통해 사용 가능한 JDBC 4.3 기능이 필요한 경우에만 사용할 수 있습니다..
예시:
ojdbc8.jar:
Connection conn = DriverManager.getConnection(. . .); // beginRequest은 java 8에 포함되지 않기 때문에 conn.beginRequest(); 은 실패합니다.
((OracleConnection)conn).beginRequest(); // Oracle extension 에서 beginRequest가 지원되므로 성공합니다.
ojdbc10.jar:
Connection conn = DriverManager.getConnection(. . .); conn.beginRequest(); // beginRequest은 Java 10 에 포함되므로 성공합니다
((OracleConnection)conn).beginRequest(); // OracleConnection는 JDBC 4.3 (in Java 10) 를 지원하고 beginRequest는 JDBC 4.3의 기능이므로 성공합니다.
추가 참고 사항
- 11g JDBC 드라이버는 JDK 5 또는 JDK 6에서만 인증되었습니다.
- Oracle Database 12c 릴리스 2(12.2.0.1)에서 Oracle JDBC 드라이버는 더 이상 JDK 7 또는 이전 버전을 지원하지 않습니다.
- 또한 classes12.jar, oracle.jdbc.driver 및 OracleConnectionCacheImpl의 지원 중단에 유의하십시오.
Since Server Thin Driver and Server Internal Driver are running within the Oracle Server, those drivers support the Oracle JVM version:
Oracle 9i R1 supports J2SE 1.2
Oracle 9i R2 supports J2SE 1.3
Oracle 10g supports J2SE 1.4
Oracle 11g supports J2SE 1.5
JDBC 드라이버와 접속하는 데이터베이스와의 호환 관계?
정확한 정보 확인을 위해서는 사용하는 JDBC 버전의 JDBC 개발자 가이드 또는 레퍼러스 문서 확인이 필요하다. JDBC 개발자 가이드와 11g 릴리즈 레퍼런스 문서에 다음과 같이 언급되어있다:
이전 버전과의 호환성
오라클 데이터베이스 12c 릴리즈 1 (12.1) JDBC 드라이버는 오라클 데이터베이스 릴리즈(11.x.0.x)와 호환된다. 그러나 10.2.x, 10.1.x, 9.2.x, 및 9.0.1.x와 같은 지원 중단된 예전 버전들과는 호환되지 않는다.
이후 버전과의 호환성
기존 및 지원되는 JDBC 드라이버는 오라클 데이터베이스 12c 릴리즈 1 과 호환된다.
주요 기능은 동작하더라도 데이터베이스의 새로운 기능은 이전 드라이버에서 사용할 수 없는 경우가 발생할 수 있다. 따라서 데이터베이스 버전과 JDBC 드라이버 버전은 적어도 동일한 버전 사용을 권고한다.
아래 note를 참고하여 오라클 클라이언트(오라클 JDBC 드라이버)버전과 오라클 서버 간의 상호 호환성에 대하여 확인가능하다:
Note 207303.1 : Client / Server / Interoperability Support Between Different Oracle Versions
다음은 JDBC 드라이버가 오라클 데이터베이스에 액세스할 수 있는 호환 정보이다 :
JDBC drivers |
Oracle database |
23c |
23c 21c 19c 18c 12.2.0 12.1.0 |
21.c |
21c 19c 18c 12.2.0 12.1.0 |
19.c |
21c 19c 18c 12.2.0 12.1.0 11.2.0 |
18.c |
21c 19c 18c 12.2.0 12.1.0 11.2.0 |
12.2.0 |
21c 19c 18c 12.2.0 12.1.0 11.2.0 |
12.1.0 |
21c 19c 18c 12.2.0 12.1.0 11.2.0 11.1.0 |
11.2.0
|
19c* 18c* 12.2.0* 12.1.0 11.2.0 11.1.0 10.2.0 10.1.0 9.2.0 |
11.1.0 |
12.1.0 11.2.0 11.1.0 10.2.0 10.1.0 9.2.0 |
10.2.0 |
12.1.0 11.2.0 11.1.0 10.2.0 10.1.0 9.2.0 |
10.1 |
11.2.0 11.1.0 10.2.0 10.1.0 9.2.0 |
9.2.0
|
11.2.0 11.1.0 10.2.0 10.1.0 9.2.0 |
중요 :이 매트릭스에는 이전 버전의 JDBC 및 더 이상 지원되지 않거나 확장 지원을 통해서만 지원되는 데이터베이스에 대한 인증 정보가 포함되어 있습니다. 그것들은 완전성을 위해 여기에 포함됩니다. 지원되는 클라이언트 / 서버 상호 운용성 목록은 NOTE:207303.1" target="_blank">207303.1> : Client / Server / Interoperability Support Between Different Oracle Versions를 참고하십시오
주의 :
* 11.2.0.3 또는 11.2.0.4 만 해당
자바 JDBC 라이브러리 얻는 방법 ?
자바 JDBC 라이브러리는 세 가지 방법으로 얻을 수 있다:
또한 오라클 JDBC 드라이버는 퓨젼 미들웨어 제품과 같은 오라클 제품에 포함 될 수 있다. 이런 경우 오라클 JDBC 드라이버 호환 및 업그레이드에 대한 문의는 해당 오라클 제품 문서를 참조할 수 있다.
JDBC 드라이버 설치 방법?
문서, Javadoc, 예제와 같은 JDBC 드라이버 리소스를 어디서 찾을 수 있는가?
JDBC 드라이버 버전과 관련된, 다음 리소스들이 존재한다 :
예를 들면, 오라클 데이터베이스 JDBC Developer's Guide and Reference 11g Release 2 (11.2)
JDBC Developer's Guide and Reference 12c Release 1 (12.1)
새로운 기능
주요 버그 수정
드라이버 버전
환경 설정법
유용한 힌트들
어떤 오라클 JDBC 드라이버부터 사용해야하는가?
10g JDBC Thin 드라이버는 JDBC OCI 드라이버와 거의 동일한 기능을 제공한다(TAF기능과 같이 오라클 JDBC OCI 드라이버에서만 제공되는 몇가지 기능 예외). Thin 드라이버는 JDBC 자바 라이브러리만 (JDBC OCI드라이버는 전체 오라클 또는 인스턴트 클라이언트 설치가 필요한 반면) 필요하다. 10g JDBC Thin 드라이버 버전부터, 오라클 JDBC 드라이버는 오라클 데이터베이스를 액세스하기 위한 더 빠른 프로토콜(OCI/TTC 8)을 사용한다. JDBC thin 드라이버의 한가지 제약조건은 데이터베이스를 액세스하기 위해 TCP/IP 프로토콜을 사용하는 것이다.
따라서, 11g R2(10g 또는) 또는 12c R1 JDBC thin 드라이버를 사용하는 것이 좋다.
JDBC 애플리케이션 수행하기
JDBC 애플리케이션을 수행하기 위한 환경 설정 방법?
클라이언트쪽 JDBC 프로그램 (OCI 또는 Thin 타입)을 수행하기 위해, 오라클 JDBC 자바 라이브러리가 CLASSPATH에 추가되어야 한다.
오라클 JDBC OCI 드라이버를 사용한다면, JDBC 드라이버와 정확하게 일치하는 버전의 오라클 클라이언트 설치가 필요하다. JDBC 프로그램이 수행되는 플랫폼 환경에 따라, 오라클 JDBC OCI 공유 라이브러리가 저장된 디렉토리를 PATH (윈도우즈), LD_LIBRARY_PATH (유닉스) or LIBPATH (AIX)에 추가해야한다.
추가로, 64 비트 플랫폼에서는 32 비트 JVM - 자바 실행파일이 32 bit 또는 64 비트 JVM - 자바 실행파일이 64bit 사용 여부에 대한 선택의 여지가 있을 수 있다.
64 비트 JVM을 JDBC OCI 드라이버와 사용하고자 한다면, JDBC OCI 공유 라이브러리는 64 비트 라이브러리여야 한다.
이와 유사하게, 32 비트 JVM을 오라클 JDBC OCI 드라이버와 사용하고자 한다면, JDBC OCI 공유 라이브러리는 32 비트 라이브러리여야 한다
아래는 10.2 JDBC 드라이버 사용에 대한 예제 설정이다 :
- JDK 1.2 또는 1.3을 사용하는 경우, [ORACLE_HOME]\jdbc\lib\classes12.jar 를 CLASSPATH에 추가한다.
JDK 1.4를 사용한다면, [ORACLE_HOME]\jdbc\lib\ojdbc14.jar를 CLASSPATH에 추가한다.
- 필요하다면 [ORACLE_HOME]\jlib\orai18n.jar를 CLASSPATH에 추가한다.
- JDBC OCI 드라이버를 사용한다면, [ORACLE_HOME]\bin을 PATH에 추가한다.
- JDK 1.2 또는 1.3을 사용하는 경우, [ORACLE_HOME]/jdbc/lib/classes12.jar를 CLASSPATH에 추가한다.
JDK 1.4를 사용한다면 [ORACLE_HOME]/jdbc/lib/ojdbc14.jar를 CLASSPATH에 추가한다.
- 필요하다면 [ORACLE_HOME]/jlib/orai18n.jar를 CLASSPATH에 추가한다.
- JDBC OCI 드라이버를 사용한다면, [ORACLE_HOME]/lib을 LD_LIBRARY_PATH에 추가한다.
solaris 64 플랫폼에서 64 비트 오라클 설치된 경우:
- 오라클 JDBC OCI 드라이버 사용을 위해 32 비트 JVM을 사용하는경우, $ORACLE_HOME/lib32를 LD_LIBRARY_PATH에 추가한다.
- 오라클 JDBC OCI 드라이버 사용을 위해 64 비트 JVM을 사용하는경우, $ORACLE_HOME/lib를 LD_LIBRARY_PATH에 추가한다.
어떤 오라클 JDBC 팩키지를 import 가능한가 ?
다음과 같은 팩키지들을 import 할 수 있다:
oracle.jdbc.*;
oracle.jdbc.pool.*;
oracle.sql.*;
그러나 oracle.jdbc.driver.* 팩키지는 import 하지 말아야한다. 9iR1부터 사용되지않으며(deprecated), 향후 지원되지 않는다.
이 제품의 지원중단 공지사항에 대해서 다음 문서를 참조할 수 있다:
Document 1439541.1 : The oracle.jdbc.driver was "deprecated" in 9.0.1 and "desupported" in 11.1.
오라클 JDBC 드라이버 API를 사용하여 JDBC 연결을 얻는 방법 ?
기본적으로, 오라클 JDBC 드라이버를 등록한 후에, java.sql.DriverManager의 getConnection() 메소드 호출을 통해 JDBC 연결을 생성할 수 있다.
...
DriverManager.registerDriver(new oracle.jdbc.OracleDriver() );
Connection conn = DriverManager.getConnection( dbUrl, <User>, <Password>);
...
OracleDataSource의 getConnection 메소드를 사용하는 경우 좀 더 유연한 방법을 제공한다:
...
ds = new oracle.jdbc.pool.OracleDataSource();
ds.setURL(dbUrl);
Connection conn = ds.getConnection(<User>, <Password>);
...
10g JDBC 드라이버부터, 암시적 연결 캐싱 메커니즘을 제공한다.
오라클 데이터베이스 11g Release 2 (11.2)부터, 암시적 연결 캐싱 기능은 사용되지(deprecated)않는다. 그리고, 오라클은 JDBC의 Universal Connection Pool (UCP) 사용을 권고한다.
오라클 JDBC 연결 URL은 무엇인가 ?
연결 URL은 연결하고자 하는 오라클 데이터베이스의 주소를 정의한다:
jdbc:oracle:<drivertype>:<username>/<password>@<database>
오라클 드라이버 타입에 따라, 다음과 같은 URL 형식을 가진다 :
데이터베이스 위치는:
- 엔트리 이름은 tnsnames.ora에 정의된다
이것은 TNS_ADMIN 환경 변수 설정이 필요할 수 있다.
- 리스너의 위치와 서비스 이름을 정의된 디스크립터.
- //<host>[:<port>]/<service>
<host>는 오라클 데이터베이스 서버의 호스트 이름 또는 IP 주소
<port> 는 오라클 리스너의 포트 번호
<service>는 오라클 데이터베이스의 서비스 이름.
데이터베이스 위치는:
- 리스너의 위치와 서비스 이름을 정의된 디스크립터.
- //<host>[:<port>]/<service>
<host>는 오라클 데이터베이스 서버의 호스트 이름 또는 IP 주소
<port>는 오라클 리스너의 포트 번호
<service>는 오라클 데이터베이스의 서비스 이름.
JDBC 연결은 동시에 2개의 자바 쓰레드에서 공유될 수 있는가 ?
하나의 쓰레드가 한번에 JDBC 연결 및 관련 객체에 접근해야한다:
"여러개의 스레드가 동시에 하나의 연결을 액세스 하지 않도록 하십시오. 만일 여러개의 스레드가 하나의 연결을 공유해야한다면 disciplined begin-using/end-using 프로토콜을 사용하십시오."
(JDBC 개발자 및 레퍼런스 가이드에서의 코딩 팁)