=====Database Resident Connection Pooling (DRCP) ===== **ab 11g** PHP und auch Python Anwendungen neigen dazu, ohne echtes eigenes Connection Pooling entwickelt/realisiert zu werden. Um aber zig Tausende von sich ständig neu aufbauenden Verbindungen möglichst Ressourcen schonend aufzubauen hat Oracle das DRCP Feature mit der 11g Datenbank eingeführt. {{ :dba:oracle_drcp_connection_pooling_v02.png?500 | Database Resident Connection Pooling (DRCP)}} Der Client verbindet sich mit den Connection Broker (CMON) und autorisiert sich an der Datenbank. Der Connection Brocker weißt den Client einen "dedicated Server Prozess" zu, der dem Client solange zugeordnet bleibt, bis ein Timeout abläuft oder der Client die Verbindung schließt. Vorteil: Für eine neue Verbindung muss nicht jedes Mal ein neuer Server Prozess geöffnet werden! D.h. das DRCP Feature "pooled" "Dedicated Server" Prozesse und schont damit die Ressourcen des Datenbank Servers damit nicht bei jeden Connect eine aufwendiger Prozess durch das Starten des Server Prozess durchlaufen werden muss. === Connection Broker (CMON) starten ==== Die Konfiguration erfolgt auf Datenbank Seite mit dem "DBMS_CONNECTION_POOL" Package. Im ersten Schritt den Default Pool starten mit: sqlplus / as sysdba execute dbms_connection_pool.start_pool; Die DB merkt sich diesen Status und startet den Broker auch beim nächsten Start der DB automatisch. Einstellungen und Status prüfen: select CONNECTION_POOL , STATUS , MINSIZE , MAXSIZE , INCRSIZE , SESSION_CACHED_CURSORS , INACTIVITY_TIMEOUT , MAX_THINK_TIME , MAX_USE_SESSION , MAX_LIFETIME_SESSION , NUM_CBROK , MAXCONN_CBROK from DBA_CPOOL_INFO order by 1 / Bzgl. der Konfiguration siehe http://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc004.htm#ADMIN12349 Die Einstellungen lassen sich mit dbms_connection_pool.configure_pool einstellen begin dbms_connection_pool.configure_pool(null ,minsize=>3 ,maxsize=>10 ); dbms_connection_pool.stop_pool; dbms_connection_pool.start_pool; end; / In diesem Beispiel starten wir mit drei Servern und es können maximal 10 werden. Damit die Änderungen auch wirksam werden, muss der Pool neu gestartet werden. Bei der Anzahl der Dedicated pooled Sever ist zu beachten, dass min. ein freier Server für die Autorisierung einer neuen Klient Anfrage immer benötigt wird. ===Registrierung im Listener prüfen=== Darauf achten das in der DB der LOCAL_LISTENER Parameter auch (richtig) gesetzt ist! Über **lsnrctl service** prüfen, ob der Pool Handler verfügbar ist und sich am Listener registriert hat: {{ :dba:oracle_drcp_connection_pooling_v01.png |Oracle DRCP - lsnrctl service - Pool Handler prüfen}} Soll der Brocker auf einer speziellen IP Adresse laufen: * Oracle Support Portal : How to Configure DRCP Broker to Use a Specific Listening IP Address (Doc ID 1333553.1) === Pool wieder stoppen === sqlplus / as sysdba exec dbms_connection_pool.stop_pool(); ---- === Konfiguration auf Client Site in Python === TNS Alias einrichten mit der (SERVER=POOLED) Anweisung: ORAGPI_POOL= DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = POOLED) (SERVICE_NAME = PRODDB) ) ) oder alternativ das POOLED Keyword in Connectstring verwenden: 10.10.10.1:1521/PRODDB:POOLED Folgende Eigenschaften müssten im Connection Objekt zusätzlich gesetzt werden: * Name der "cclass" => Ein String Wert, der sich später wieder in der CCLASS Spalte der V$CPOOL_CC_STATS View wieder findet * purity zum Beispiel cx_Oracle.ATTR_PURITY_SELF siehe Kommentar im Code import cx_Oracle import time # The cclass argument is expected to be a string and defines the connection class for database resident connection pooling (DRCP) in Oracle 11g and higher. # # The purity argument is expected to be one of: # ATTR_PURITY_NEW (the session must be new without any prior session state) # ATTR_PURITY_SELF (the session may have been used before) # ATTR_PURITY_DEFAULT (the default behavior which is defined by Oracle in its documentation). This argument is only relevant in Oracle 11g and higher. # for i in range(0,20): connection = cx_Oracle.connect('gpi', 'gpi', 'ORAGPI_POOL' , cclass = 'SYSTEM.SHARED', purity = cx_Oracle.ATTR_PURITY_DEFAULT) print connection.version cursor = connection.cursor() cursor.execute('select * from dual') time.sleep(1) cursor.close() connection.close() **Problem**: cx_Oracle.DatabaseError: ORA-12523: TNS: Listener konnte Instanz für Client-Verbindung nicht finden Service hinzugefügt und auch gleich mal den Parameter local_listener geprüft! #Service name Parameter pürfen show parameter service_names #Anpassen bei Bedarf alter system set service_names='GPI,PRODDB' scope=both sid='*'; #Local Listener pürfen show parameter local_listener #Local Listener setzen falls falsch alter system set local_listener='10.10.10.1:1521' scope=both sid='*'; #DB am local Listener registrieren alter system register; # exit #Listener überprüfen lsnrctl status und tnsnames Service Name entsprechend angepasst, geprüft ==== Überwachen ==== see [[https://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_1083.htm#REFRN30487|V$CPOOL_STATS]]: select POOL_NAME ,NUM_OPEN_SERVERS ,NUM_BUSY_SERVERS ,NUM_AUTH_SERVERS ,NUM_REQUESTS ,NUM_HITS ,NUM_MISSES ,NUM_WAITS ,WAIT_TIME ,CLIENT_REQ_TIMEOUTS ,NUM_AUTHENTICATIONS ,NUM_PURGED ,HISTORIC_MAX from V$CPOOL_STATS order by 1 / Session using DRCP (see [[http://docs.oracle.com/cd/E18283_01/server.112/e17110/dynviews_1092.htm|V$CPOOL_CONN_INFO]] ): select USERNAME , PROXY_USER , CCLASS_NAME , PURITY --, TAG , SERVICE , PROGRAM --, MACHINE , TERMINAL , CONNECTION_MODE , CONNECTION_STATUS , CLIENT_REGID from V$CPOOL_CONN_INFO order by 1 / Für das komplette Überwachung Skript * => https://orapowershell.codeplex.com/SourceControl/latest#sql/connection_pool.sql ====Database Resident Connection Pooling - Quellen==== Oracle: * http://www.oracle.com/technetwork/articles/oracledrcp11g-1-133381.pdf * http://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc004.htm#ADMIN12349 Oracle Support: * Master Note: Overview of Database Resident Connection Pooling (DRCP) (Doc ID 1501987.1) * Example of Database Resident Connection Pooling (DRCP) Usage (Doc ID 577865.1) * How to measure saved memory consumption using DRCP instead of dedicated connections Or shared connections? (Doc ID 1420381.1) Web: * https://blogs.oracle.com/opal/entry/python_cx_oracle_and_oracle