![]() |
![]() |
|
Using WebLogic jDriver for Oracle/XA in Distributed Transactions
The following sections describe how to integrate transactions with EJB and RMI applications that use the WebLogic jDriver for Oracle/XA and run under BEA WebLogic Server.
Differences Using the WebLogic jDriver for Oracle in XA versus Non-XA Mode
Weblogic jDriver for Oracle supports fully the JDBC 2.0 Optional Package API for distributed transactions. Applications using the driver in distribution transaction (XA) mode can use all JDBC 2.0 Core API the same way as in local distribution (non-XA mode), with the exception of the following:
The reason for the last two differences is because when the WebLogic jDriver for Oracle/XA participates in a distributed transaction, it is the external Transaction Manager that is demarcating and coordinating the distributed transaction.
For more information, refer to JDBC 2.0 Standard Extension API spec [version 1.0, dated 98/12/7 Section 7.1 last 2 paragraphs] for more detailed explanation.
Configuring JDBC XA and Non-XA Resources
You use the Administration Console to configure your JDBC resources, as described in the following sections.
To allow XA JDBC drivers to participate in distributed transactions, configure the JDBC connection pool as follows:
See the Administration Console Online Help on the JDBC Connection Pools panel for procedures and attribute definitions.
To support non-XA JDBC resources:
Limitations of the WebLogic jDriver for Oracle XA
Weblogic jDriver for Oracle in XA mode does not support the following:
This topic includes the following sections:
Listing 4-1 shows the packages that the application imports. In particular, note that:
Listing 4-1 Importing Required Packages
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
Finding the Data Source via JNDI
Listing 4-2 shows finding the data source via JNDI.
Listing 4-2 Finding the Data Source via JNDI
static DataSource pool;
...
public void get_connpool(String pool_name)
throws Exception
{
try {
javax.naming.Context ctx = new InitialContext();
pool = (DataSource)ctx.lookup("jdbc/" + pool_name);
}
catch (javax.naming.NamingException ex){
TP.userlog("Couldn't obtain JDBC connection pool: " + pool_name);
throw ex;
}
}
}
Performing a Distributed Transaction
Listing 4-3 shows a distributed transaction involving two database connections and implemented as a business method within a session bean.
Listing 4-3 Performing a Distributed Transaction
public class myEJB implements SessionBean {
EJBContext ejbContext;
public void myMethod(...) {
javax,transaction.UserTransaction usertx;
javax.sql.DataSource data1;
javax.sql.DataSource data2;
java.sql.Connection conn1;
java.sql.Connection conn2;
java.sql.Statement stat1;
java.sql.Statement stat2;
InitialContext initCtx = new InitialContext();
//
// Initialize a user transaction object.
//
usertx = ejbContext.getUserTransaction();
//Start a new user transaction.
usertx.begin();
// Establish a connection with the first database
// and prepare it for handling a transaction.
data1 = (javax.sql.DataSource)
initCtx.lookup("java:comp/env/jdbc/DataBase1");
conn1 = data1.getConnection();
stat1 = conn1.getStatement();
// Establish a connection with the second database
// and prepare it for handling a transaction.
data2 = (javax.sql.DataSource)
initCtx.lookup("java:comp/env/jdbc/DataBase2");
conn2 = data1.getConnection();
stat2 = conn2.getStatement();
//Update both conn1 and conn2. The EJB Container
//automatically enlists the participating resources.
stat1.executeQuery(...);
stat1.executeUpdate(...);
stat2.executeQuery(...);
stat2.executeUpdate(...);
stat1.executeUpdate(...);
stat2.executeUpdate(...);
//Commit the transaction (apply the changes to the
//participating databases).
usertx.commit();
//Release all connections and statements.
stat1.close();
stat2.close();
conn1.close();
conn2.close();
}
...
}
|
Copyright © 2000 BEA Systems, Inc. All rights reserved.
|