Nicht gemeinsam und gemeinsam nutzbare Verbindungen
Der Anwendungsserver unterstützt sowohl "nicht gemeinsam nutzbare" als auch "gemeinsam nutzbare" Verbindungen. Eine nicht gemeinsam nutzbare Verbindung wird jeweils nur von einer Komponente der Anwendung benutzt. Die Komponente, die diese Verbindung benutzt, hat die vollständige Kontrolle über diese Verbindung.
Der Zugriff auf eine als nicht gemeinsam nutzbar gekennzeichnete Ressource bedeutet, dass eine 1-zu-1-Beziehung zwischen der Verbindungskennung einer Komponente und der physischen Verbindung besteht, der die Kennung zugeordnet ist. Dieser Zugriff impliziert, dass jeder Aufruf der Methode "getConnection" nur eine Verbindungskennung für den anfordernden Benutzer zurückgibt. Üblicherweise müssen Sie nicht gemeinsam nutzbare Verbindungen wählen, wenn Sie in der Verbindung Aktionen ausführen, die bei einer Anwendung, die dieselbe Verbindung benutzt, zu unerwartetem Verhalten führen könnten (z. B. unvermutete Änderung der Isolationsstufe).
Die Kennzeichnung einer Ressource als gemeinsam nutzbar bietet bessere Skalierungsmöglichkeiten. Anstatt für jeden Aufruf von getConnection() eine neue physische Verbindung aus dem Verbindungspool abzurufen, wird die physische Verbindung (d. h. verwaltete Verbindung) über mehrere Verbindungshandles gemeinsam genutzt, solange jede getConnection-Anforderung dieselben Verbindungseigenschaften hat. Die gemeinsame Benutzung einer Verbindung bedeutet aber auch, dass in einer Verbindung keine Aktionen vorgenommen werden, die deren Verhalten ändern und andere Benutzer, die dieselbe Verbindung verwenden, beeinträchtigen (z. B. Änderung der Isolationsstufe). Außerdem kann der Benutzer eine Anwendung nicht so programmieren, dass sie die gemeinsame Benutzung voraussetzt, weil allein die Laufzeitumgebung entscheidet, ob eine bestimmte Verbindung gemeinsam benutzt wird.
Anforderungen für Verbindungseigenschaften
- JNDI-Name (Java™ Naming and Directory Interface). Der JNDI-Name ist eigentlich keine Verbindungseigenschaft. Diese Anforderung bedeutet einfach, dass Verbindungen nur dann gemeinsam benutzt werden können, wenn sie von derselben Datenquelle desselben Servers stammen.
- Ressourcenauthentifizierung
- In relationalen Datenbanken:
- Isolationsstufe (entspricht Richtlinien für Zugriffsarten für CMP-Beans)
- Readonly
- Catalog
- TypeMap
Weitere Informationen zur gemeinsamen Nutzung einer Verbindung mit einer CMP-Bean finden Sie im entsprechenden Artikel.
- JNDI-Name. Der JNDI-Name ist eigentlich keine Verbindungseigenschaft. Diese Anforderung bedeutet einfach, dass Verbindungen nur dann gemeinsam genutzt werden können, wenn sie von derselben Verbindungsfactory in demselben Server stammen.
- Ressourcenauthentifizierung
JMS-Verbindungen für den JMS-Provider von IBM MQ können nicht gemeinsam genutzt werden, da sie nicht transaktionsorientiert sind und laut JCA-Spezifikation (Java™ EE Connector Architecture) nur transaktionsorientierte Ressourcen gemeinsam genutzt werden dürfen. Wenn die Eigenschaft "res-sharing-scope" in einer JMS-Ressourcenreferenz auf "shareable" (gemeinsam nutzbar) gesetzt ist, wird die Einstellung ignoriert, und es werden nicht gemeinsam nutzbare Verbindungen verwendet. JMS-Sitzungen für MQ sind jedoch transaktionsorientiert und können gemeinsam genutzt werden. JMS-Sitzungen können standardmäßig gemeinsam genutzt werden, und APAR PK59605 bietet die Möglichkeit, Sitzungen, die nicht gemeinsam genutzt werden können, zu definieren.
JMS-Verbindungen für den Standard-Messaging-Provider weichen ab. Mit dem Standard-Messaging-Provider können Verbindungen gemeinsam genutzt werden. Andererseits werden Sitzungen nicht in einem Verbindungspool verwaltet und können daher nicht nach dem Kriterium "gemeinsam nutzbar" bzw. "nicht gemeinsam nutzbar" unterschieden werden.
Verbindung mit einer CMP-Bean gemeinsam nutzen
- Gemeinsame Nutzung einer Verbindung durch CMP-Beans oder Methoden
Wenn alle CMP-Bean-Methoden dieselbe Zugriffsart verwenden, nutzen sie dieselbe physische Verbindung. Verwenden die Methoden unterschiedliche Richtlinien für Zugriffsarten, werden unterschiedliche physische Verbindungen zugeordnet. Beispiel: Eine CMP-Bean hat zwei Methoden: Methode 1 hat die Zugriffsart wsPessimisticUpdate und Methode 2 die Zugriffsart wsOptimisticUpdate. Methode 1 und Methode 2 können deshalb in einer Transaktion nicht dieselbe physische Verbindung verwenden. Anders ausgedrückt, eine XA-Datenquelle muss in einer globalen Transaktion ausgeführt werden.
Es können Situationen mit gegenseitigem Sperren auftreten, wenn beide Methoden versuchen, auf dieselbe Tabelle in der Datenbank zuzugreifen. Deshalb wird Möglichkeit der gemeinsamen Verwendung einer Verbindung durch die Zugriffsarten bestimmt, die in den CMP-Methoden definiert sind.
- Gemeinsame Verwendung einer Verbindung durch CMP- und BMP-Beans
Vergewissern Sie sich zunächst, ob die getConnection-Methoden der BMP-Bean und der CMP-Bean dieselben Verbindungseigenschaften festlegen. Zwecks Übereinstimmung mit dem Authentifizierungstyp der CMP-Bean-Ressource muss der Authentifizierungstyp der BMP-Bean-Ressource auf "containergesteuert" gesetzt werden. Dies wird im Implementierungsdeskriptor wie folgt angegeben: res-auth = Container.
Darüber hinaus sollten Sie mit einer der folgenden Optionen sicherstellen, dass die Bean-Typen eine Verbindung gemeinsam verwenden:- Für die Methoden der CMP- und BMP-Beans dieselbe Zugriffsart definieren. Wenn alle Methoden dieselbe Zugriffsart verwenden, kann eine gemeinsame physische Verbindung verwendet werden. Diese Vorgehensweise hat den Vorteil, dass das Back-End für die BMP-Beans transparent ist. Allerdings sind bei Verwendung dieser Option die BMP-Beans nicht portierbar, weil sie die erweiterte API von WebSphere für Isolationsstufen verwenden. Weitere Informationen finden Sie im Codebeispiel im Artikel "Beispiel: Mit den erweiterten IBM® APIs auf Daten zugreifen, um die gemeinsame Verwendung von Verbindungen durch CMP- und BMP-Beans zu ermöglichen.
- Isolationsstufe, die die Zugriffsart verwendet, in einer CMP-Bean festlegen und dann die entsprechende Isolationsstufe, die in der Ressourcenreferenz angegeben ist, verwenden, um eine Datenquelle und eine Verbindung zu ermitteln. Diese Vorgehensweise ist eher ein manueller Prozess, und die Isolationsstufe kann von Datenbank zu Datenbank variieren. Weitere Informationen finden Sie in der Tabelle zur Zuordnung von Isolationsstufen zu Zugriffsarten im Artikel "Isolationsstufen für Zugriffsarten und Aktualisierungssperren" und im Artikel "Isolationsstufe und Ressourcenreferenz".
- Gemeinsame Nutzung einer Verbindung durch eine CMP-Bean und eine JDBC-Anwendung, die von einem Servlet oder einer Session-Bean verwendet wird: Legen Sie die Isolationsstufe, die die Zugriffsart verwendet, in einer CMP-Bean-Methode fest, und verwenden Sie dann die entsprechende Isolationsstufe, die in der Ressourcenreferenz angegeben ist, um eine Datenquelle und eine Verbindung zu ermitteln. Weitere Informationen finden Sie im Artikel "Isolationsstufen für Zugriffsarten" und im Artikel "Isolationsstufe und Ressourcenreferenz".
Faktoren, die über gemeinsame Benutzung entscheiden
Diese Auflistung ist nicht vollständig. Es kann sein, dass das Produkt unter verschiedenen Umständen Verbindungen gemeinsam nutzt oder auch nicht.- Geeignet für gemeinsame Benutzung sind nur solche Verbindungen, die mit derselben Ressourcenreferenz
(resource-ref) angefordert werden, in der "res-sharing-scope" mit shareable definiert ist. Anhand der Eigenschaften
der Ressourcenreferenz, res-sharing-scope, res-auth und
isolationLevel der IBM Erweiterung kann bestimmt werden, ob eine Verbindung für gemeinsame Benutzung
auswählbar ist. Die IBM Erweiterung
"isolationLevel" ist in der Erweiterungsdatei des
IBM Implementierungsdeskriptors, z. B. ibm-ejb-jar-ext.xmi, gespeichert.
Unterstützte Konfigurationen: Bei IBM Erweiterungs- und Bindungsdateien weicht der Name der XMI- oder XML-Datei ab, je nachdem, ob Sie eine Java EE-Anwendung bzw. ein Java EE-Modul vor oder nach Version 5 verwenden. Eine IBM Erweiterungs- bzw. Bindungsdatei heißt "ibm-*-ext.xmi" bzw. "ibm-*-bnd.xmi". Das Platzhalterzeichen "*" steht für den Typ der Erweiterungs- oder Bindungsdatei, z. B. "app", "application", "ejb-jar" oder "web". Es gelten die folgenden Bedingungen:
Ein Modul von Java EE Version 5 oder einer höheren Version kann jedoch in einer Anwendung, die Dateien einer älteren Java EE-Version als Version 5 enthält, koexistieren.
Die Dateien ibm-webservices-ext.xmi, ibm-webservices-bnd.xmi, ibm-webservicesclient-bnd.xmi, ibm-webservicesclient-ext.xmi und ibm-portlet-ext.xmi können die Dateierweiterung ".xmi" weiterhin verwenden.
sptcfg - Nur Verbindungen, die mit denselben Eigenschaften angefordert werden, sind gemeinsam nutzbar.
- Die gemeinsame Benutzung von Verbindungen findet bei unterschiedlichen Komponenteninstanzen nur dann statt, wenn diese sich in einer Transaktion befinden (vom Container oder Benutzer eingeleitete Transaktion).
- Die gemeinsame Benutzung von Verbindungen findet nur innerhalb einer gemeinsamen Grenze statt. Zu den aktuellen gemeinsamen Grenzen gehören Transaktionen und LocalTransactionContainment (LTC).
- Regeln für gemeinsame Benutzung von Verbindungen in einem LTC-Bereich:
- Für gemeinsam nutzbare Verbindungen ist in einer Komponenteninstanz
nur Wiederverwendung von Verbindungen zulässig. Eine Verbindung wird wieder verwendet, wenn die folgenden Aktionen für eine Verbindung ausgeführt werden:
get, use, commit/rollback, close; get, use, commit/rollback, close. Wenn
Sie die LTC-Auflösungssteuerung ContainerAtBoundary verwenden, ist kein
Starten und Festschreiben (start/commit) erforderlich, weil diese Aktion vom Container
ausgeführt wird.
Die Verbindung, die bei der zweiten get-Anforderung zurückgegeben wird, ist dieselbe Verbindung wie bei der ersten get-Anforderung (sofern dieselben Eigenschaften verwendet werden). Weil es sich um eine serielle Wiederverwendung handelt, wird jeweils nur eine Verbindungskennung für die zugrunde liegende physische Verbindung verwendet. Eine echte gemeinsame Nutzung von Verbindungen findet also nicht statt. Der Begriff Wiederverwendung ist zutreffender.
Wichtiger ist jedoch, dass die LocalTransactionContainment-Grenze, die die beiden get-Aktionen umschließt, noch nicht abgeschlossen ist. Es wurde keine Methode cleanUp() für das Objekt ManagedConnection aufgerufen. Daher übernimmt die zweite get-Aktion alle Verbindungseigenschaften, die beim ersten Aufruf der Methode getConnection() festgelegt wurden.
- Für gemeinsam nutzbare Verbindungen ist in einer Komponenteninstanz
nur Wiederverwendung von Verbindungen zulässig. Eine Verbindung wird wieder verwendet, wenn die folgenden Aktionen für eine Verbindung ausgeführt werden:
get, use, commit/rollback, close; get, use, commit/rollback, close. Wenn
Sie die LTC-Auflösungssteuerung ContainerAtBoundary verwenden, ist kein
Starten und Festschreiben (start/commit) erforderlich, weil diese Aktion vom Container
ausgeführt wird.
- Für gemeinsam von Transaktionen benutzbare Verbindungen (CMT-, BMT-
oder LTC-Transaktionen) gelten folgende Regeln für das Zwischenspeichern:
- Im Allgemeinen ist es nicht erlaubt, Eigenschaften für gemeinsam nutzbare Verbindungen zu definieren, da ein Benutzer einer Verbindungskennung mögliche Änderungen durch eine andere Verbindungskennung nicht absehen kann. Diese Einschränkung ist Teil des Standards Java Platform, Enterprise Edition (Java EE).
- Die Endbenutzer von Ressourcenadaptern können die Verbindungseigenschaften im Aufruf
von getConnection() der Verbindungsfactory festlegen, indem sie sie in einer
Verbindungsspezifikation übergeben.
Die während einer Transaktion für eine Verbindung festgelegten Eigenschaften müssen jedoch nicht identisch sein, wenn sie in der nächste Transaktion verwendet werden. Da die gemeinsame Benutzung von Verbindungen außerhalb des Geltungsbereichs für gemeinsame Benutzung nicht zulässig ist, werden Verbindungskennungen am Transaktionsende von der physischen Verbindung entfernt, der sie vorübergehend zugeordnet waren. Die physische Verbindung wird an den Pool freier Verbindungen zurückgegeben. Die Verbindungen werden vor der Rückgabe an den Pool freier Verbindungen entfernt. Bei der nächsten Verwendung der Kennung wird sie automatisch einer geeigneten Verbindung zugeordnet. Die Eignung einer Verbindung basiert auf den Daten für sichere Anmeldung, den Verbindungseigenschaften und (für die JDBC-API) auf der in der erweiterten Ressourcenreferenz definierten Isolationsstufe, die in der ursprünglichen Anforderung übergeben wurden, die die aktuelle Kennung zurückgegeben hat. Alle Eigenschaften, die für die Verbindung festgelegt wurden, nachdem diese abgerufen wurde, gehen verloren.
- Für JDBC-Benutzer bietet der Anwendungsserver eine Erweiterung, mit der sie die Verbindungseigenschaften in der
Verbindungsspezifikation weitergeben können.
Vorsicht ist geboten, wenn Sie im Geltungsbereich einer lokalen Transaktion Eigenschaften einstellen und Verbindungen gemeinsam nutzen. Stellen Sie sicher, dass andere Komponenten, die dieselbe Verbindung benutzen, dasselbe Verhalten erwarten, das aus Ihren Einstellungen resultiert.
- Sie können keine Isolationsstufe festlegen, wenn Sie eine gemeinsam nutzbare Verbindung für die JDBC-API und einen relationalen Ressourcenadapter in einer globalen Transaktion verwenden. Das Produkt bietet eine Erweiterung für die Ressourcenreferenz, mit der Sie die Isolationsstufe angeben können. Falls Ihre Anwendung die Verwendung mehrerer Isolationsstufen voraussetzt, erstellen Sie mehrere Ressourcenreferenzen und ordnen diese derselben Datenquelle oder Verbindungsfactory zu.
Gemeinsame Nutzung von Verbindungen maximieren
Damit die Möglichkeiten der gemeinsamen Nutzung von Verbindungen für eine Anwendung maximiert werden, müssen Sie sicherstellen, dass das LTC-Attribut "Resolver" (Local Transaction Containment) für jede Komponente auf ContainerAtBoundary gesetzt ist. Diese Einstellung legt fest, dass alle lokalen Transaktionen des Ressourcenmanagers (Resource Manager Local Transactions, RMLTs) im LTC-Geltungsbereich vom Komponentencontainer anstatt vom Anwendungscode aufgelöst werden. Der Container startet eine RMLT bei der erstmaligen Verwendung einer Verbindung im LTC-Geltungsbereich und beendet sie automatisch am Ende des LTC-Geltungsbereichs.
Anweisungen zum Festlegen der Transaktionsauflösungssteuerung und weiterer Attribute finden Sie im Artikel "Attribute für die Transaktionsimplementierung konfigurieren".
Verstoß gegen gemeinsame Nutzung von Verbindungen
- Der verwalteten Verbindung sind mehrere Verbindungskennungen zugeordnet.
- Die verwaltete Verbindung ist einer lokalen oder XA-Transaktion zugeordnet.
Ob die Komponente und die J2C-Laufzeitumgebung die Ausnahme über einen Konflikt beim gemeinsamen Zugriff erkennen müssen, richtet sich danach, wann und wie die verwaltete Verbindung als nicht mehr gemeinsam nutzbar deklariert wird. Wenn die verwaltete Verbindung aufgrund einer Operation für die Verbindungskennung nicht mehr gemeinsam nutzbar ist (Sie ändern beispielsweise die Isolationsstufe), muss die Komponente die Ausnahme verarbeiten. Falls die verwaltete Verbindung nicht mehr gemeinsam genutzt werden kann, ohne dass dies vom Anwendungsserver erkannt wird (aufgrund einer Interaktion der Komponente mit der Verbindungskennung), kann der Ressourcenadapter die Erstellung einer Verbindungskennung mit der Ausnahme über einen Konflikt beim gemeinsamen Zugriff verweigern.