Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_connection_pooling

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.

 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:

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 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 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

Database Resident Connection Pooling - Quellen

Oracle:

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:

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_connection_pooling.txt · Zuletzt geändert: 2015/01/27 12:13 von Gunther Pippèrr