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.
- 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.
InFreePool > InUse: getConnection AND freeConnectionAvailable AND NOT(shareableConnectionAvailable)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.getConnection AND NOT(freeConnectionAvailable) AND poolSizeLTMax AND (NOT(shareableConnectionAvailable) OR unshareableConnectionRequest)
- 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.
InFreePool>InUse: getConnection AND freeConnectionAvailable AND (unshareableConnectionRequest OR NOT(shareableConnectionAvailable))
- 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.
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.
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)
- 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.
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.
- 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.
- 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.
- 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.