OCI8 연결 처리 및 연결 풀링

연결 함수

OCI8 확장은 Oracle에 연결하기 위한 세 가지 다른 함수를 제공합니다. 표준 연결 함수는 oci_connect()입니다. 이렇게 하면 Oracle 데이터베이스에 대한 연결이 생성되고 후속 데이터베이스 호출에 사용되는 리소스가 반환됩니다.

Oracle 서버에 연결하는 작업은 완료하는 데 걸리는 시간 측면에서 합리적으로 비용이 많이 드는 작업입니다. oci_pconnect() 함수는 여러 스크립트 요청에서 재사용할 수 있는 연결의 영구 캐시를 사용합니다. 이것은 연결 오버헤드가 일반적으로 PHP 프로세스(또는 Apache 자식)당 한 번만 발생한다는 것을 의미합니다.

응용 프로그램이 각 웹 사용자에 대해 서로 다른 데이터베이스 자격 증명 세트를 사용하여 Oracle에 연결하는 경우 oci_pconnect()가 사용하는 영구 캐시는 동시 사용자 수가 증가함에 따라 덜 유용하여 전체에 부정적인 영향을 미칠 수 있습니다. 너무 많은 유휴 연결을 유지 관리하여 Oracle 서버의 성능이 저하됩니다. 애플리케이션이 이러한 방식으로 구성되어 있는 경우 oci8.max_persistentoci8.persistent_timeout 구성 설정(영구 연결 캐시 크기 및 수명을 제어할 수 있음)을 사용하여 애플리케이션을 조정하거나 Oracle Database 상주 연결 풀링( Oracle Database 11g 이상) 또는 대신 oci_connect()를 사용하십시오.

oci_connect()oci_pconnect() 모두 연결 캐시를 사용합니다. oci_connect()에 대한 여러 호출이 주어진 스크립트에서 동일한 매개변수를 사용하는 경우 두 번째 및 후속 호출은 기존 연결 핸들을 반환합니다. oci_connect()가 사용하는 캐시는 스크립트 실행이 끝날 때 또는 연결 핸들이 명시적으로 닫힐 때 정리됩니다. oci_pconnect() 함수는 캐시가 별도로 유지 관리되고 HTTP 요청 간에 유지되지만 비슷한 동작을 합니다.

이 캐싱 기능은 두 핸들이 트랜잭션적으로 격리되지 않았음을 의미합니다(실제로 동일한 연결 핸들이므로 어떤 종류의 격리도 없음). 애플리케이션이 두 개의 개별 트랜잭션으로 격리된 연결을 필요로 하는 경우 oci_new_connect()를 사용하십시오.

PHP 프로세스가 종료되면 oci_pconnect() 캐시가 지워지고 모든 데이터베이스 연결이 닫히므로 지속적인 연결을 효과적으로 사용하려면 PHP가 Apache 모듈이거나 FPM과 함께 사용되거나 이와 유사한 것이 필요합니다. 영구 연결은 PHP가 CGI와 함께 사용되거나 명령줄을 통해 사용될 때 oci_connect()보다 이점이 없습니다.

oci_new_connect() 함수는 이미 존재하는 다른 연결에 관계없이 항상 Oracle 서버에 대한 새 연결을 생성합니다. 트래픽이 많은 웹 애플리케이션은 특히 애플리케이션의 가장 바쁜 섹션에서 oci_new_connect() 사용을 피해야 합니다.

OCI8 1.3부터 ​​사용자가 영구 연결을 닫을 수 있으므로 연결 리소스 사용을 더 잘 제어할 수 있습니다. 영구 연결은 이제 PHP 사용자 함수의 범위 끝과 같이 이를 참조하는 PHP 변수가 없을 때 자동으로 닫힙니다. 커밋되지 않은 트랜잭션을 롤백합니다. 영구 연결에 대한 이러한 변경으로 인해 비영구 연결과 유사하게 작동하여 인터페이스가 단순화되어 애플리케이션 일관성과 예측 가능성이 향상됩니다. On으로 설정된 oci8.old_oci_close_semantics를 사용하여 기록 동작을 유지합니다.

Apache 또는 FPM 프로세스가 다시 생성된 후 PHP 영구 연결이 자동으로 재설정된다는 것은 Oracle Database LOGON 트리거가 애플리케이션별 사용자 연결 요청이 아닌 세션 속성 설정에만 권장된다는 것을 의미합니다.

DRCP 연결 풀링

5.3의 PHP(PECL OCI8 1.3)는 Oracle DRCP(데이터베이스 상주 연결 풀링)를 지원합니다. DRCP는 데이터베이스 시스템 메모리를 보다 효율적으로 사용하고 높은 확장성을 제공합니다. DRCP를 사용하려면 애플리케이션 변경이 필요하지 않거나 최소한으로 변경해야 합니다.

DRCP는 적은 수의 데이터베이스 스키마를 사용하여 연결하고 짧은 기간 동안 데이터베이스 연결을 유지하는 애플리케이션에 적합합니다. 다른 응용 프로그램은 Oracle의 기본 전용 데이터베이스 서버 프로세스를 사용하거나 공유 서버를 사용해야 합니다.

DRCP는 세 가지 연결 함수 모두에 이점이 있지만 oci_pconnect()로 연결을 생성할 때 가장 높은 확장성을 제공합니다.

OCI8에서 DRCP를 사용하려면 PHP에서 사용하는 Oracle 클라이언트 라이브러리와 Oracle Database 버전이 모두 11g 이상이어야 합니다.

DRCP에 대한 문서는 여러 Oracle 설명서에서 찾을 수 있습니다. 예를 들어 사용 정보는 Oracle 설명서에서 » Configuring Database Resident Connection Pooling을 참조하세요. A » DRCP 백서에는 DRCP에 대한 배경 정보가 포함되어 있습니다.

DRCP를 사용하려면 OCI8 1.3(이상) 확장과 Oracle 11g(이상) 라이브러리를 설치한 후 다음 단계를 따르세요.

  • 권한이 있는 데이터베이스 관리자는 SQL*Plus와 같은 프로그램을 사용하여 데이터베이스에서 연결 풀을 시작합니다.
    SQL> execute dbms_connection_pool.start_pool;
                        
  • 선택적으로 dbms_connection_pool.alter_param()을 사용하여 DRCP 설정을 구성합니다. 현재 풀 설정은 DBA_CPOOL_INFO 보기에서 쿼리할 수 있습니다.
  • 사용된 연결 문자열을 업데이트합니다. 현재 MYDB와 같은 네트워크 연결 이름을 사용하여 연결하는 PHP 애플리케이션의 경우:
    $c = oci_pconnect("myuser", "mypassword", "MYDB");
                        

    tnsnames.ora 파일을 수정하고 (SERVER=POLED) 절을 추가합니다. 예를 들면 다음과 같습니다.

    MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
             (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
             (SERVER=POOLED)))
                        

    또는 PHP에서 Easy Connect 구문을 수정하고 서비스 이름 뒤에 :POOLED를 추가합니다.

    $c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
                        
  • php.ini를 편집하고 연결 클래스 이름을 선택합니다. 이 이름은 연결 풀의 논리적 구분을 나타내며 별도의 응용 프로그램에 대한 풀링을 분리하는 데 사용할 수 있습니다. 동일한 사용자 이름과 연결 클래스 값을 가진 모든 PHP 응용 프로그램은 풀에서 연결을 공유할 수 있으므로 더 큰 확장성을 제공합니다.
    oci8.connection_class = "MY_APPLICATION_NAME"
                        
  • 11g(또는 그 이상) 데이터베이스에 연결하여 애플리케이션을 실행합니다.

메모: 영구 연결 성능이 필요한 Oracle Client 라이브러리 10g를 사용하는 애플리케이션은 Oracle Shared 서버(이전에는 다중 스레드 서버로 알려짐)를 사용하여 필요한 데이터베이스 서버 메모리의 양을 줄일 수 있습니다. 자세한 내용은 Oracle 설명서를 참조하십시오.

메모: DRCP 연결을 통한 암호 변경은 ORA-56609: DRCP에서 지원되지 않는 사용 오류와 함께 실패합니다. 이것은 Oracle Database 11g의 문서화된 제한 사항입니다.