Verteilte Transaktionen mit EJBs und JDBC 2.0 Oder, Java gets paranoid ! Richard Bourke Agenda Verteilte Transaktionen und Object Transaktion Monitor JDBC 2.0 Einführung Enterprise Java Beans in Zusammenhang mit JDBC 2.0 Copyright © 1999 MERANT INC. Was sind Verteilte Transaktionen ? •Transaktionen auf mehrere, auch heterogenen Datenbanken •Alle beteiligte Datenbanken sind immer in einem konsistenten Zustand •Früher immer von einem Transaktions-Monitor gesteuert •Unabdingbar für unternehmenskritische Applikationen •XA, 2 Phase-Commit, Long Transaction sind (fast) Synonyme Copyright © 1999 MERANT INC. Java Virtual Machine Java Applet RM I EJB Server 2PC DBMS 1 DBMS 2 Arten von Transaktionsmonitore Proprietär Prozedurale Interfaces zu Sprachen wie C, C++, Cobol Verbindungen zu Datenbanken ebenso proprietär Object Transaction Monitor (OTM) Basiert auf Corba Transaction Service / Microsoft DCOM OO Interfaces möglich Verbindung zu Datenbanken noch proprietär Enterprise Java Beans Grafische integration in OO Entwicklungsumgebungen Standardisierte Interfaces zu Datenbanken Copyright © 1999 MERANT INC. Copyright © 1999 MERANT INC. Java 2 Platform Standard Edition beinhaltet JDBC 2.0 (core plus extensions) Enterprise Edition Enterprise Java Beans 1.1 Java Transaction API (JTA) Java Servlets Java Server Pages Compatibility Tests ( in etwa 100% Pure Java für Application Servers) Copyright © 1999 MERANT INC. Was ist JDBC? Das Datenbank-Connectivity API für Java Low-Level / wenige Abstraktion High-level Komponenten Embedded SQL (SQLJ) Object Relational Mapping Werkzeuge TM Plattformen Enterprise JavaBeans 4 Arten von JDBC Treibern Copyright © 1999 MERANT INC. DataDirect SequeLink Java Edition Ein universeller JDBC-Treiber für alle Datenbanken, dadurch maximale DBUnabhängigkeit Kombiniert Performance von Typ 4-Lösung mit Flexibilität von Typ 3 Beste Möglichkeit für Java/OS 390 Einsetzbar in beliebigen Java-Konfigurationen, da 100% Pure Java zertifiziert Höchste Zuverlässigkeit und Stabilität, da auf bewährter SequeLink-Plattform basierend Copyright © 1999 MERANT INC. JDBC 2.0 Neue Features JDBC Core (java.sql) Scrollable-Cursors Unterstützung Neue Datentypen Batch Updates JDBC Standard Extension (javax.sql) Connection Pooling Rowsets Java Naming and Directory Interface (JNDI) Verteilte Transaktionen Copyright © 1999 MERANT INC. JDBC 2.0 Das einzige offizielle API für DatenbankTransactionen mit "Distributed Unit of Work" JDBC wird als "Resource Adapter" vom Transaction Manager verwendet Stellt dem Transaction Manager Dienste zur Verfügung: Connection Pooling XA Verteilte Transaktionen Copyright © 1999 MERANT INC. JDBC 2.0: Connection Pooling Transparent für die Applikationen Wird intern vom DataSource object verwaltet durch javax.sql.PooledConnection() (implementiert von EJB Server ) javax.sql.ConnectionPoolDataSource (implementiert von JDBC Treiber) Copyright © 1999 MERANT INC. Connection Pooling: Code Beispiel Connection con = null; try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup( "jdbc/ inventoryDB"); con = ds. getConnection( user, password); . . . } finally { if (con != null) con. close(); Copyright © 1999 MERANT INC. JDBC 2.0: Distributed XA Transactions Wenige Code-Änderungen: Kein Connection.commit() Kein Connection.rollback() Kein Connection.setAutoCommit() Wird intern von DataSource object verwaltet JDBC Treiber muß folgende JDBC XA Interfaces implementieren: javax.sql.XADataSource javax.sql.XAConnection In SequeLink Java Edition in Q3 99 Copyright © 1999 MERANT INC. XA Transactions Object Diagram Copyright © 1999 MERANT INC. Transaction Attribute Summary für implizite Steuerung Copyright © 1999 MERANT INC. Beispiel Code (in EJB) // Create multi-component, multi-distributor order // in Bean-Demarcated Session Bean Context ctx = new InitialContext(); ds1 = (DataSource) ctx.lookup("jdbc/ inventoryDB1"); ds2 = (DataSource) ctx.lookup("jdbc/ inventoryDB2"); ut = ctx. getUserTransaction(); ut. begin(); con1 = ds1.getConnection( user1, password1); con2 = ds2.getConnection( user2, password2); Copyright © 1999 MERANT INC. Beispiel Code (2) stmt1 = con1. createStatement(); stmt2 = con2. createStatement(); Flag = true // loop through order lines for each <component> { // check stock levels rs = stmt1. executeQuery( "select stock, arttype, price from stock " + "where artnm like <componentname>"”); Copyright © 1999 MERANT INC. Beispiel Code (3) if (rs. getInt( stock) != 0) // decrement stock of item in DB1 stmt1. execute(" update stock set stock=" + (rs. getInt(" stock")- 1) where artnm= <component>"); // add new account record in DB2 stmt2. execute(" insert into account values( '" + name + "', '" + address + "', " + rs. getInt(" arttype") + ", " + rs. getInt(" price") + ")"); else flag = false } Copyright © 1999 MERANT INC. Beispiel Code (4) // if order can be completely filled, create the order, otherwise // rollback if (flag) ut. commit(); else ut. rollback(); Copyright © 1999 MERANT INC. Referenzen Ejb1_1-publicdraft2.pdf jdbc spec 2.0 standard extension.pdf Developing Mission- Critical Applications using JDBC 2.0 Technology Seth White, JavaSoft. http://industry.java.sun.com/javaone/99/tracks/ Copyright © 1999 MERANT INC.