Oracle 에 붙는 길은 여럿이고, 클라이언트 설치 여부가 가장 큰 갈림길이다.
| 방식 | 클라이언트 필요 | 쓰는 곳 |
|---|---|---|
| JDBC Thin | 없음. ojdbc11.jar 만 있으면 된다 |
Java 애플리케이션, Hive·Sqoop·NiFi 같은 도구 |
| JDBC OCI | Oracle Client 필요 | Thin 이 지원하지 않는 일부 기능이 필요할 때 |
| OCI (C/C++) | 필요 | SQL*Plus, PL/SQL Developer 등 Oracle 도구 |
| python-oracledb Thin | 없음 | Python. cx_Oracle 의 후속 |
| python-oracledb Thick | Instant Client 필요 | Wallet · 일부 고급 인증이 필요할 때 |
| ODBC | Instant Client ODBC 패키지 필요 | SAS · 리포팅 도구 · 범용 클라이언트 |
| ORDS | 서버 쪽 구성 | REST 로 접근할 때 |
Thin 모드가 되는 상황이면 Thin 을 쓴다. 클라이언트 설치와 라이브러리 경로 문제를 통째로 피할 수 있다.
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@//dbhost:1521/FREEPDB1", "app_owner", System.getenv("DB_PASSWORD"));
드라이버 클래스는 oracle.jdbc.OracleDriver 다. 예전 문서에 나오는 oracle.jdbc.driver.OracleDriver 는 오래전부터 권장되지 않는다. JDBC 4.0 이상에서는 Class.forName 을 부를 필요도 없다.
URL 은 SID 형식(@host:1521:ORCL)과 서비스 이름 형식(@//host:1521/SERVICE)이 다르다. 멀티테넌트에서는 PDB 의 서비스 이름을 쓴다.
import oracledb
conn = oracledb.connect(
user="app_owner",
password=${MASKED}"DB_PASSWORD"],
dsn="dbhost:1521/FREEPDB1",
)
기본이 Thin 모드라 Instant Client 가 없어도 동작한다. Thick 모드가 필요하면 oracledb.init_oracle_client(lib_dir="/opt/oracle/instantclient_23_5") 를 접속 전에 한 번 호출한다. cx_Oracle 은 유지보수만 되는 상태이므로 새 코드는 python-oracledb 를 쓴다.
Instant Client 는 Basic 과 ODBC 패키지가 따로다. 둘 다 받아 같은 디렉터리에 푼 뒤 odbc_update_ini.sh 를 실행하거나 아래 파일들을 직접 쓴다.
드라이버 등록은 /etc/odbcinst.ini 다.
[Oracle 23 ODBC driver]
Description = Oracle ODBC driver for Oracle
Driver = /opt/oracle/instantclient_23_5/libsqora.so.23.1
FileUsage = 1
데이터 원본은 /etc/odbc.ini 또는 ~/.odbc.ini 다.
[ORADSN]
Driver = Oracle 23 ODBC driver
ServerName = ORADB
UserID = app_owner
ServerName 에는 호스트가 아니라 tnsnames.ora 의 별칭을 적는다. 비밀번호는 여기에 쓰지 않는다.
ORADB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = FREEPDB1))
)
환경 변수는 프로세스를 띄우는 쪽에 걸어야 한다. 셸에서만 걸고 서비스로 기동하면 적용되지 않는다.
export ORACLE_HOME=/opt/oracle/instantclient_23_5
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
LD_LIBRARY_PATH 대신 /etc/ld.so.conf.d/oracle-instantclient.conf 에 경로를 넣고 ldconfig 를 돌리는 편이 서비스 환경에서 안정적이다.
# 드라이버와 DSN 목록
odbcinst -q -d
odbcinst -q -s
# 접속 시험
isql -v ORADSN app_owner "${DB_PASSWORD}"
# TNS 별칭이 풀리는지
tnsping ORADB
isql 은 unixODBC 패키지에 들어 있다. libsqora.so 를 찾지 못하면 ldd /opt/oracle/instantclient_23_5/libsqora.so.23.1 로 빠진 의존성을 확인한다. libodbcinst.so 가 없다고 나오면 unixODBC-devel 을 설치한다.