eXtreme-Scale-Clientkomponenten für die Verwendung von Transaktionen entwickeln

[Version 8.5 und höher] Der Ressourcenadapter von WebSphere eXtreme Scale stellt Unterstützung für das Management von Clientverbindungen und für lokale Transaktionen bereit. Mit dieser Unterstützung können Java-EE-Anwendungen (Java Platform, Enterprise Edition) Clientanwendungen von eXtreme Scale suchen und lokale Transaktionen mit lokalen Java-EE-Transaktionen oder mit den APIs von eXtreme Scale abgrenzen.

Vorbereitende Schritte

Erstellen Sie eine Ressourcenreferenz auf die Verbindungsfactory von eXtreme Scale.

Informationen zu diesem Vorgang

Es gibt mehrere Optionen für die Arbeit mit den Datenzugriffs-APIs von eXtreme Scale. In allen Fällen muss die Verbindungsfactory von eXtreme Scale in die Anwendungskomponente injiziert oder mit JNDI (Java Naming Directory Interface) gesucht werden. Nachdem die Verbindungsfactory gefunden wurde, können Sie Transaktionen abgrenzen und Verbindungen für den Zugriff auf die APIs von eXtreme Scale erstellen.

Die javax.resource.cci.ConnectionFactory-Instanz kann optional in eine com.ibm.websphere.xs.ra.XSConnectionFactory umgesetzt werden, die weitere Optionen für den Abruf von Verbindungshandles bereitstellt. Die abgerufenen Verbindungshandles muss in die Schnittstelle com.ibm.websphere.xs.ra.XSConnection umgesetzt werden, die die Methode getSession bereitstellt. Die Methode getSession gibt ein com.ibm.websphere.objectgrid.Session-Objekthandle zurück, das Anwendungen die Verwendung alle Datenzugriffs-APIs von eXtreme Scale wie ObjectMap und EntityManager ermöglicht.

Das Sitzungshandle und alle abgeleiteten Objekte sind für die Lebensdauer des XSConnection-Handles gültig.

Die folgenden Prozeduren können verwendet werden, um Transaktionen von eXtreme Scale abzugrenzen. Die Prozeduren können nicht gemischt verwendet werden. Es ist beispielsweise nicht möglich, globale Transaktionsdemarkation und lokale Transaktionsdemarkation im Kontext derselben Anwendungskomponente gemischt zu verwenden.

Vorgehensweise

Beispiel

Sehen Sie sich das folgende Codebeispiel an, das die vorherigen Schritte für die Demarkation der Transaktionen von eXtreme Scale veranschaulicht.
    // (C) Copyright IBM Corp. 2001, 2012.
    // All Rights Reserved. Licensed Materials - Property of IBM.
    package com.ibm.ws.xs.ra.test.ee;
     
    import javax.naming.InitialContext;
    import javax.resource.cci.Connection;
    import javax.resource.cci.ConnectionFactory;
    import javax.resource.cci.LocalTransaction;
    import javax.transaction.Status;
    import javax.transaction.UserTransaction;
     
    import junit.framework.TestCase;
     
    import com.ibm.websphere.objectgrid.ObjectMap;
    import com.ibm.websphere.objectgrid.Session;
    import com.ibm.websphere.xs.ra.XSConnection;
     
    /**
    * Dieses Beispiel muss in einem J2EE-Kontext in Ihrem Anwendungsserver
    * ausgeführt werden, z. B. über das JUnitEE-Framework-Servlet.
    *
    * Der Code in diesen Testmethoden befindet sich gewöhnlich in Ihrem
    * eigenen Servlet, Ihrer eigenen EJB oder einer anderen Webkomponente.
    *
    * Das Beispiel ist von einer konfigurierten Verbindungsfactory von WebSphere eXtreme Scale
    * abhängig, die unter dem JNDI-Namen "eis/embedded/wxscf" registriert wurde und
    * eine Verbindung zu einem Grid definiert, das eine Map mit dem Namen "Map1" enthält.
    *
    * Das Beispiel führt ein Direkt-Lookup des JNDI-Namens durch und erfordert
    * Keine Ressourceninjektion.
    */
    public class DocSampleTests extends TestCase {
        public final static String CF_JNDI_NAME = "eis/embedded/wxscf";
        public final static String MAP_NAME = "Map1";
       
        Long                key = null;
        Long                value = null;
        InitialContext      ctx = null;
        ConnectionFactory   cf = null;
       
        public DocSampleTests() {
        }
        public DocSampleTests(String name) {
            super(name);
        }
        protected void setUp() throws Exception {
            ctx = new InitialContext();
            cf = (ConnectionFactory)ctx.lookup(CF_JNDI_NAME);
            key = System.nanoTime();
            value = System.nanoTime();
        }
        /**
         * Dieses Beispiel wird ausgeführt, wenn kein globaler Transaktionskontext
         * vorhanden ist, und verwendet automatische Festschreibung.
         */
        public void testLocalAutocommit() throws Exception {
            Connection conn = cf.getConnection();
            try  {    
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
            }
            finally {
                conn.close();
            }
        }
     
        /**
         * Dieses Beispiel wird ausgeführt, wenn kein globaler Transaktionskontext
         * vorhanden ist, und grenzt die Transaktion mit session.begin()/session.commit() ab.
         */
        public void testLocalSessionTransaction() throws Exception {
            Session    session = null;
            Connection conn = cf.getConnection();
            try  {    
                session = ((XSConnection)conn).getSession();
                session.begin();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                session.commit();
            }
            finally {
                if (session != null && session.isTransactionActive()) {
                    try { session.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                conn.close();
            }
        }
       
        /**
         * Dieses Beispiel verwendet die Schnittstelle LocalTransaction für die
         * Demarkation von Transaktionen.
         */
        public void testLocalTranTransaction() throws Exception {
            LocalTransaction tx = null;
            Connection conn = cf.getConnection();
            try  {    
                tx = conn.getLocalTransaction();
                tx.begin();
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                tx.commit(); tx = null;
            }
            finally {
                if (tx != null) {
                    try { tx.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                conn.close();
            }
        }
       
        /**
         * Dieses Beispiel ist von einer extern verwalteten Transaktion abhängig,
         * die gewöhnlich in einer EJB enthalten ist, deren Transaktionsattribute
         * auf REQUIRED oder REQUIRES_NEW gesetzt sind.
         * ANMERKUNG: Wenn keine globale Transaktion aktiv ist, wird dieses Beispiel
         *            im Modus für automatische Festschreibung ausgeführt, weil nicht
         *            geprüft wird, ob eine Transaktion vorhanden ist.
         */
        public void testGlobalTransactionContainerManaged() throws Exception {
            Connection      conn = cf.getConnection();
            try  {    
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
            }
            catch (Throwable t) {
                t.printStackTrace();
                UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
                if (tx.getStatus() != Status.STATUS_NO_TRANSACTION) {
                    tx.setRollbackOnly();
                }
            }
            finally {
                conn.close();
            }
        }
       
        /**
         * Dieses Beispiel veranschaulicht das Starten einer neuen globalen Transaktion
         * mit der Schnittstelle UserTransaction. Gewöhnlich startet der Container die
         * globale Transaktion (z. B. in einer EJB, deren Transaktionsattribut auf
         * REQUIRES_NEW gesetzt ist), aber auch dieses Beispiel startet die globale Transaktion
         * mit der API UserTransaction, falls sie momentan nicht aktiv ist.
         */
        public void testGlobalTransactionTestManaged() throws Exception {
            boolean         started = false;
            UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
            if (tx.getStatus() == Status.STATUS_NO_TRANSACTION) {
                tx.begin();
                started = true;
            }
            // else { called with an externally/container managed transaction }
            Connection conn = null;
            try  {    
                conn = cf.getConnection(); // Verbindung nach Start der globalen Transaktion abrufen
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                if (started) {
                    tx.commit(); started = false; tx = null;
                }
            }
            finally {
                if (started) {
                    try { tx.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                if (conn != null) { conn.close(); }   
            }
        }
    }