Datenbank Connection Pooling in 11g
von Ulrike Schwinn, ORACLE Deutschland GmbH

Webbasierende Applikationen haben häufig die Eigenschaft, Datenbankverbindungen und somit Connection-Ressourcen der Datenbank zu benötigen. Beim Öffnen einer Website beispielsweise wird eine Datenbankverbindung eingerichtet, nach dem Laden der Website ist die Verbindung zur Datenbank wieder getrennt. Bei wiederholten weiteren Zugriffen auf diese Website werden dann erneut Datenbankverbindungen aufgebaut. Dies bedeutet, dass u.U. eine grosse Anzahl von simultanen Verbindungen (auch Connections) für Webapplikationen in der Datenbank zur Verfügung gestellt werden müssen. Was hat dies nun mit Ihrer Arbeit als Datenbankadministrator zu tun?

Die Ressourcen könnten natürlich mit dem Datenbank Ressource Manager beschränkt werden (siehe dazu auch den Tipp Ressourcen managen mit Database Resource Manager). In der Regel möchte man dies wahrscheinlich verhindern.

Der Einsatz von Oracle Shared Server kann eine Unterstützung liefern, um diese Anforderungen zu lösen, indem Oracle Server Prozesse auf der Datenbankseite "shared" zur Verfügung gestellt werden. Sinnvoll ist dies besonders daher, weil insgesamt weniger Prozesse auf Datenbankseite allokiert werden und somit weniger Ressourcen benötigt werden. Häufig werden diese Prozesse dann auch längere Zeit gehalten. Was ist allerdings bei vielen kurzen Sessions, die wie im obigen Fall beschrieben, ihre Datenbankaktivität über mehrere Requests unabhängig vom "Session State" definieren?

Database Resident Connection Pooling (kurz DRCP), ein neues Feature in Oracle Database 11g, das standardmässig zur Verfügung steht, addressiert genau diese Problematik auf sehr einfache Art und Weise.

Wie funktioniert nun DRCP? Nach dem Einschalten von DRCP wird automatisch eine Menge von dedizierten Datenbankservern zu sogenannten Pooled Servern zusammengefasst. Diese können dann gemeinsam von mehreren Applikationen genutzt werden. Die Clients sind dabei fest mit einem Broker verbunden, der die Zuweisung zu einem Server im Pool regelt. Nach dem Verbindungsaufbau ist das Verhalten vergleichbar mit einer dedizierten Serververbindung - so wird auch PGA Memory statt SGA Memory verwendet.

Wird zum Beispiel die Verbindung von der Clientseite zum Pooled Server beendet, besteht die Verbindung zum Broker weiterhin. Ein weiterer Unterschied zur Shared Server Architektur ist die Tatsache, dass Server im Pool oder Clients, die "idle" sind, nach einer gewissen einstellbaren Zeit beendet werden.

Folgende Graphik zeigt einen Architekturüberblick.


Für eine größere Ansicht auf das Bild klicken.

Danach können Applikationen, die kein eigenes Connection Pooling zur Verfügung stellen, beispielsweise in PHP oder Perl implementierte Applikationen, von dieser Funktionalität profitieren, um ihre Connection-Ressourcen zu verringern.

Die Funktionalität ist datenbankseitig durch das PL/SQL Paket DBMS_CONNECTION_POOL implementiert. DRCP wird dabei mit START_POOL gestartet und STOP_POOL gestoppt. Zu Beginn ist DRCP nicht eingeschaltet und kann, wie im Listing zu sehen ist, folgendermaßen gestartet werden.

execute DBMS_CONNECTION_POOL.START_POOL
Nun können die Clients das DRCP nutzen. Dazu ist beispielsweise nur die Angabe von "POOLED" im Easy Connect String notwendig.
sqlplus scott/tiger@stusunmuc-xyz.de.oracle.com:1521/servicename:POOLED
Soll im Connectstring ein TNS Alias verwendet werden, wird die tnsnames.ora Datei um den Eintrag (SERVER=POOLED) erweitert.
SESPOOL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = stusunmuc-xyz)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = servicename)
      (SERVER = POOLED)
    )
  )
Eine Parametrierung der Poolgrösse bzgl. der Anzahl der maximalen bzw. minimalen Sessions, des Timeouts usw. kann mit der Prozedur CONFIGURE_POOL oder ALTER_POOL (bei Änderung von einzelnen Parametern) des Package DBMS_CONNECTION_POOL durchgeführt werden. So gibt der Parameter MAX_THINK_TIME den Zeitraum an, nach dem Clients, die "idle" sind, beendet werden. In folgendem Listing wird die MAX_THINK_TIME auf 300 gesetzt. Erfolgt nun nach 5 Minuten keine Datenbankanforderung vom Client, muss der Client die Verbindung zum Server aufgeben und erhält eine Fehlermeldung.
execute DBMS_CONNECTION_POOL.ALTER_PARAM ('','MAX_THINK_TIME','300');
Da es im Moment nur einen Pool mit Namen SYS_DEFAULT_CONNECTION_POOL gibt, kann das erste Argument leer bleiben. Mehr Information dazu findet sich im Handbuch Oracle Database PL/SQL Packages and Types Reference 11g Release 1 (11.1).

Möchte man die Konfiguration des Pools monitoren, nutzt man am besten folgende Abfrage:
SELECT * FROM DBA_CPOOL_INFO;

CONNECTION_POOL
--------------------------------------------------------------------------------
STATUS              MINSIZE    MAXSIZE   INCRSIZE SESSION_CACHED_CURSORS
---------------- ---------- ---------- ---------- ----------------------
INACTIVITY_TIMEOUT MAX_THINK_TIME MAX_USE_SESSION MAX_LIFETIME_SESSION
------------------ -------------- --------------- --------------------
SYS_DEFAULT_CONNECTION_POOL
ACTIVE                   10         20          2                     20
               300            120          500000                86400
Die Statistiken über die laufenden Verbindungsaktivitäten lassen sich dann über die V$CPOOL_STATS monitoren. Dabei gibt beispielsweise NUM_OPEN_SERVERS die Anzahl der Server im Pool und NUM_REQUESTS die Anzahl der Client Anfragen an.
SELECT pool_name, num_open_servers, num_busy_servers, num_auth_servers, num_requests 
FROM V$CPOOL_STATS;

POOL_NAME
--------------------------------------------------------------------------------
NUM_OPEN_SERVERS NUM_BUSY_SERVERS NUM_AUTH_SERVERS NUM_REQUESTS
---------------- ---------------- ---------------- ------------
SYS_DEFAULT_CONNECTION_POOL
              10                3                1            9
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...

Zurück zur Community-Seite