Lebensdauer von Verbindungen

Gültige Status für ManagedConnection-Objekte sind DoesNotExist, InFreePool und InUse.

Bevor eine Verbindung erstellt wird, hat sie den Zustand DoesNotExist. Nachdem sie erstellt wurde, kann sie entweder den Zustand InUse oder InFreePool haben, abhängig davon, ob sie einer Anwendung zugeordnet ist.

Zwischen diesen drei Status gibt es Übergänge. Diese Übergänge werden von Überwachungsbedingungen gesteuert. Wenn eine Überwachungsbedingung den Wert true hat, kann der Übergang in einen anderen gültigen Status vollzogen werden. Der Übergang vom Status InFreePool in den Status "InUse" ist nur dann möglich, wenn Folgendes zutrifft:
  • Die Anwendung hat die Methode "getConnection()" (die Bedingung getConnection) der Datenquelle oder Verbindungsfactory aufgerufen.
  • Es ist eine freie Verbindung mit zutreffenden Eigenschaften im Pool verfügbar (die Bedingung freeConnectionAvailable).
  • Eine der beiden folgenden Bedingungen trifft zu:
    • Die Anforderung "getConnection()" erfolgt für eine Ressourcenreferenz, die als nicht gemeinsam nutzbar gekennzeichnet ist
    • Die Anforderung "getConnection()" erfolgt zwar für eine Ressourcenreferenz, die als gemeinsam nutzbar gekennzeichnet ist, aber die es ist keine gemeinsam nutzbare Verbindung im Gebrauch, die dieselben Eigenschaften hat.
Im Folgenden wird dieser Statusübergang beschrieben:
InFreePool > InUse:
getConnection AND
freeConnectionAvailable AND
NOT(shareableConnectionAvailable)
Die folgende Liste enthält die vorhandenen Überwachungsbedingungen und die zugehörigen Beschreibungen.
Tabelle 1. Wächterbedingungen. Die folgende Liste enthält die vorhandenen Überwachungsbedingungen und die zugehörigen Beschreibungen.
Bedingung Beschreibung
ageTimeoutExpired Die Verbindung ist älter als ihr ageTimeout-Wert.
close Die Anwendung ruft die Methode close für das Verbindungsobjekt auf.
fatalErrorNotification In einer Verbindung ist soeben ein schwerwiegender Fehler aufgetreten.
freeConnectionAvailable Im Pool freier Verbindungen ist eine Verbindung mit zutreffenden Eigenschaften verfügbar.
getConnection Die Anwendung ruft die Methode "getConnection" für eine Datenquelle oder ein Verbindungsfactory-Objekt auf.
markedStale Die Verbindung wird als veraltet gekennzeichnet, in der Regel in Reaktion auf einen schwerwiegenden Fehler.
noOtherReferences Es gibt nur eine Verbindungskennung zur verwalteten Verbindung, und der Transaktionsservice besitzt keine Referenz auf die verwaltete Verbindung.
noTx Es wird keine Transaktion ausgeführt.
poolSizeGTMin Die Größe des Verbindungspools überschreitet die Mindestpoolgröße (Mindestzahl der Verbindungen).
poolSizeLTMax Die Poolgröße unterschreitet die maximale Poolgröße (Maximalanzahl der Verbindungen).
shareableConnectionAvailable Die Anforderung "getConnection()" ist für eine gemeinsam nutzbare Verbindung bestimmt, und es ist eine Verbindung mit zutreffenden Eigenschaften im Gebrauch und gemeinsam nutzbar.
TxEnds Die Transaktion wurde beendet.
unshareableConnectionRequest Die Anforderung "getConnection()" ist für eine nicht gemeinsam nutzbare Verbindung bestimmt.
unusedTimeoutExpired Die Verbindung befindet sich im Pool freier Verbindungen und auch nach Ablauf des Zeitlimits für Nichtbenutzung hinaus nicht im Gebrauch.

Verbindungen anfordern

Zunächst werden die Statusübergänge beschrieben, bei denen eine Anwendung eine Verbindung von einer Datenquelle oder einer Verbindungsfactory anfordert. In einigen dieser Szenarien wird dabei eine neue Verbindung zur Datenbank hergestellt. In anderen Szenarien kann die Verbindung aus dem Verbindungspool abgerufen oder von einer anderen Verbindungsanforderung gemeinsam nutzt werden.
Zu Beginn hat jede Verbindung den Status DoesNotExist. Wenn ein Anwendungsserver gestartet wird, ist der Verbindungspool nicht vorhanden. Deshalb gibt es auch keine Verbindungen. Die erste Verbindung wird erst dann erstellt, wenn eine Anwendung ihre erste Verbindung anfordert. Weitere Verbindungen werden bei Bedarf gemäß den Überwachungsbedingungen erstellt.
getConnection AND
NOT(freeConnectionAvailable) AND
poolSizeLTMax AND
(NOT(shareableConnectionAvailable) OR
unshareableConnectionRequest)
Dieser Statusübergang zeigt an, dass erst dann ein Verbindungsobjekt erstellt wird, wenn die folgenden Bedingungen eintreten:
  • Die Anwendung ruft die Methode "getConnection()" für die Datenquelle oder Verbindungsfactory auf.
  • Im Pool freier Verbindungen sind keine Verbindungen verfügbar (NOT(freeConnectionAvailable)).
  • Die Poolgröße liegt unter der maximalen Poolgröße (poolSizeLTMax).
  • Es handelt sich um eine Anforderung für eine gemeinsam nutzbare Verbindung, und es ist derzeit keine gemeinsam nutzbare Verbindung mit zutreffenden Eigenschaften im Gebrauch (NOT(shareableConnectionAvailable)), ODER es handelt sich um eine Anforderung für eine nicht gemeinsam nutzbare Verbindung (unshareableConnectionRequest).

Alle Verbindungen haben zunächst den Status DoesNotExist und werden erst dann hergestellt, wenn die Anwendung eine Verbindung anfordert. Die Poolgröße wächst von 0 bis hin zur maximalen Größe (maximale Anzahl der Verbindungen) an, wenn die Anwendungen neue Verbindungen anfordern. Der Pool wird beim Starten des Servers nicht mit einer Mindestanzahl von Verbindungen erstellt.

Falls es sich um die Anforderung einer gemeinsam nutzbaren Verbindung handelt und eine gemeinsam nutzbare Verbindung mit zutreffenden Eigenschaften bereits von der Anwendung genutzt wird, so wird die Verbindung von zwei oder mehr Verbindungsanforderungen gemeinsam nutzt. In diesem Fall wird keine neue Verbindung erstellt. Die am häufigsten verwendeten Eigenschaften für gemeinsame Benutzung sind für Benutzer der JDBC-API die Benutzer-ID und das Kennwort sowie der Transaktionskontext und für Benutzer des CCI (Common Client Interface) des Ressourcenadapters in der Regel die Verbindungsspezifikation, das Subjekt und der Transaktionskontext.

Der Übergang vom Status InFreePool in den Status "InUse" ist am Häufigsten zu beobachten, wenn die Anwendung eine Verbindung aus dem Pool anfordert.
InFreePool>InUse:
getConnection AND
freeConnectionAvailable AND
(unshareableConnectionRequest OR
NOT(shareableConnectionAvailable))
Dieser Übergang sagt aus, dass eine Verbindung aus dem Pool freier Verbindungen genutzt wird, wenn
  • die Anwendung einen Aufruf "getConnection()" abgesetzt hat,
  • eine geeignete Verbindung aus dem Verbindungspool verfügbar ist (freeConnectionAvailable)
  • und eine der folgenden Bedingungen zutrifft:
    • Die Anforderung ist für eine nicht gemeinsam nutzbare Verbindung bestimmt (unsharableConnectionRequest).
    • In der Transaktion ist noch keine Verbindung mit denselben Eigenschaften für gemeinsame Benutzung im Gebrauch (NOT(sharableConnectionAvailable)).

Falls eine Verbindung aus dem Pool freier Verbindungen alle Verbindungsanforderungen erfüllen kann, wird keine neue Verbindung zur Datenbank hergestellt. Wenn also immer nur eine Verbindung aus dem Pool von einer beliebigen Anzahl von Anwendungen gleichzeitig verwendet wird, steigt die Poolgröße nie über eins. Die tatsächliche Poolgröße kann kleiner sein als die für den Pool angegebene Mindestzahl an Verbindungen. Die Größe eines Pools kann dann auf die Mindestpoolgröße (Mindestanzahl der Verbindungen) anwachsen, wenn die Anwendung mehrere gleichzeitige Verbindungsanforderungen abgesetzt hat, die zum Herstellen einer neuen Verbindung führen müssen.

Die Idee der gemeinsamen Benutzung von Verbindungen verdeutlicht sich am Übergang in den Status InUse.
InUse>InUse:
getConnection AND
ShareableConnectionAvailable

Dieser Übergang sagt aus, dass bei der Anforderung einer gemeinsam nutzbaren Verbindung (getConnection), die dieselben Eigenschaften für gemeinsame Benutzung besitzt wie eine Verbindung, die bereits verwendet wird (ShareableConnectionAvailable), die vorhandene Verbindung genutzt wird.

Ein Benutzer (Benutzername und Kennwort oder Subjekt, je nach ausgewählter Authentifizierungsmethode) kann Verbindungen zwar gemeinsam nutzen, aber nur innerhalb derselben Transaktion und nur, wenn alle Eigenschaften für gemeinsame Benutzung übereinstimmen. Für JDBC-Verbindungen gehört zu diesen Eigenschaften die Isolationsstufe, die in der Ressourcenreferenz (IBM® WebSphere-Erweiterung) mit der Standardeinstellung der Datenquelle konfiguriert werden kann. Für die Verbindung zu einer Ressourcenadapterfactory gehören dazu die Eigenschaften, die in der ConnectionSpec-Objekt festgelegt wurden. Da eine Transaktion normalerweise einem einzigen Thread zugeordnet ist, sollten Sie Verbindungen nie threadübergreifend verwenden.
Anmerkung: Es gibt Situationen, in denen für mehrere Threads dieselbe Verbindung registriert ist. Dies ist jedoch ein Fehler, der in der Regel auf einen Fehler in der Anwendungsprogrammierung zurückzuführen ist.

Verbindungen zurückgeben

Bei allen bisher beschriebenen Übergängen ging es um das Anfordern einer Verbindung für eine Anwendung. Diese Übergänge führen zum Schließen einer Verbindung und zu ihrer Rückgabe an den Pool freier Verbindungen oder zu ihrer Entfernung. Anwendungen müssen Verbindungen explizit schließen (die Verbindung, die der Benutzer erhält, ist eigentlich eine Verbindungskennung), indem sie die Methode "close()" für das Verbindungsobjekt aufrufen. Diese Aktion hat in der Regel folgenden Statusübergang zur Folge:
InUse>InFreePool:
(close AND
noOtherReferences AND
NoTx AND
UnshareableConnection)
OR
(ShareableConnection AND
TxEnds)
Bedingungen, die den Übergang aus dem Status "InUse" zur Folge haben:
  • Falls die Anwendung oder der Container die Methode "close()" aufruft (Bedingung close) und keine Referenzen (Bedingung noOtherReferences) von der Anwendung (Bedingung für gemeinsame Nutzung der Anwendung) oder vom Transaktionsmanager (Bedingung NoTxd - der Transaktionsmanager hat ein Referenz, wenn die Verbindung in einer Transaktion registriert ist) vorhanden sind, wir das Verbindungsobjekt an den Pool freier Verbindungen zurückgegeben.
  • Wenn die Verbindung für eine Transaktion registriert war, aber der Transaktionsmanager die Transaktion beendet (Bedingung txEnds) und die Verbindung gemeinsam nutzbar war (Bedingung ShareableConnection), wird die Verbindung geschlossen und in den Pool zurückgegeben.

Wenn die Anwendung die Methode close() für eine Verbindung aufruft, gibt sie die Verbindung in den Pool freier Verbindungen zurück. Die Verbindung zum Datenspeicher wird nicht geschlossen. Ruft die Anwendung die Methode close() für eine derzeit gemeinsam genutzte Verbindung auf, wird die Verbindung nicht in den Pool freier Verbindungen zurückgegeben. Nur wenn die Anwendung die letzte Referenz auf die Verbindung löscht und die Transaktion abgeschlossen ist, wird die Verbindung in den Pool zurückgegeben. Anwendungen, die nicht gemeinsam nutzbare Verbindungen verwenden, müssen Verbindungen rechtzeitig schließen. Tun sie dies nicht, werden keine Verbindungen in Pool zurückgegeben, was dazu führt, dass keine Anwendung des Servers mehr eine Verbindung anfordern kann.

Wenn die Anwendung die Methode close() für eine in einer Transaktion registrierte Verbindung aufruft, wird die Verbindung nicht in den Pool freier Verbindungen zurückgegeben. Da der Transaktionsmanager ebenfalls eine Referenz zum Verbindungsobjekt besitzen muss, kann die Verbindung erst in den Pool freier Verbindungen zurückgegeben werden, wenn die Transaktion abgeschlossen ist. Wenn eine Verbindung für eine Transaktion registriert ist, können Sie sie erst nach Abschluss dieser Transaktion in einer anderen Transaktion einer anderen Anwendung verwenden.

In einem Fall kann der Aufruf der Methode close() einer Anwendung dazu führen, dass die Verbindung zum Datenspeicher geschlossen und die Rückgabe der Verbindung in den Pool umgangen wird. Dies geschieht, wenn eine der Verbindungen im Pool als veraltet eingestuft wird. Eine Verbindung wird als veraltet eingestuft, wenn Sie sie nicht mehr für die Kontaktaufnahme mit dem Datenspeicher verwenden können. Eine Verbindung wird beispielsweise dann als veraltet gekennzeichnet, wenn der Server des Datenspeichers inaktiv ist. Wenn eine Verbindung als veraltet gekennzeichnet wird, wird standardmäßig der gesamte Pool gelöscht, weil wahrscheinlich alle anderen Verbindungen aus demselben Grund veraltet sind. Sie können Ihre Konfiguration aber auch so definieren, dass nur die fehlgeschlagene Verbindung gelöscht wird. Bei dieser Bereinigung werden alle derzeit im Status InUse befindlichen Verbindungen als veraltet gekennzeichnet, damit sie beim Schließen gelöscht werden. Der folgende Statusübergang zeigt das Verhalten beim Aufruf der Methode close(), wenn die Verbindung als veraltet gekennzeichnet ist:
InUse>DoesNotExist:
close AND
markedStale AND
NoTx AND
noOtherReferences

Dieser Übergang zeigt Folgendes: Wenn eine Anwendung die Methode close() für die Verbindung aufruft und die Verbindung während der Bereinigung des Pools als veraltet markiert wurde (markedStale), wird das Verbindungsobjekt zum Datenspeicher geschlossen und nicht in den Pool zurückgegeben.

Außerdem können Sie Verbindungen zum Datenspeicher schließen und sie aus dem Pool entfernen.

Dieser Statusübergang zeigt, dass es drei Fälle gibt, in denen eine Verbindung aus dem Pool freier Verbindungen entfernt und gelöscht wird.
  1. Wenn eine Benachrichtigung über einen schwerwiegenden Fehler vom Ressourcenadapter (oder der Datenquelle) empfangen wird. Eine Benachrichtigung über einen schwerwiegenden Fehler (FatalErrorNotification) wird vom Ressourcenadapter empfangen, wenn die Verbindung durch irgendein Ereignis unbrauchbar wird. Alle Verbindungen, die derzeit im Pool freier Verbindungen enthalten sind, werden gelöscht.
  2. Wenn die Verbindung über das Zeitlimit für Nichtbenutzung hinaus (UnusedTimeoutExpired) im Pool freier Verbindungen verbleibt und die Poolgröße die Mindestzahl an Verbindungen (poolSizeGTMin) übersteigt, wird die Verbindung aus dem Pool entfernt und gelöscht. Dieser Mechanismus ermöglicht dem Pool, wieder auf seine Mindestgröße zu schrumpfen, wenn die Nachfrage nach Verbindungen abnimmt.
  3. Wenn ein Zeitlimit für die Lebensdauer konfiguriert ist und eine bestimmte Verbindung dieses Zeitlimit überschreitet. Dieser Mechanismus bietet eine Möglichkeit, Verbindung basierend auf ihrem Alter erneut zu verwenden.

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cdat_conlifcyc
Dateiname:cdat_conlifcyc.html