blob: ba97055b1c12be621923e3b9505854458e26298b [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.internal.jta;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.distributed.DistributedSystem;
import com.gemstone.gemfire.distributed.internal.InternalDistributedSystem;
import com.gemstone.gemfire.internal.jta.CacheUtils;
import com.gemstone.gemfire.internal.jta.JTAUtils;
import com.gemstone.gemfire.util.test.TestUtil;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
* This test case is to test the following test scenarios: 1) Get Simple DS
* outside transaction, begin transaction, use XA DS to get transactional
* connection, make inserts/ updates using both XA DS and Simple DS. Test for
* commit() and rollback() of both DS. 2) Test scenarios like multiple XA
* Datasouces in User Txn and test the commit, rollback 3) Observe the above
* behavior when connection exceeds Blocking Time Out. 4) Commit and rollback
* behavior when DDL query is issued after inserts abd before commit or
* rollback.
*
* @author Prafulla Chaudhari
*/
@Category(IntegrationTest.class)
public class DataSourceJTAJUnitTest {
@AfterClass
public static void afterClass() {
disconnectDS();
}
// ///setUp and tearDown methods/////
@SuppressWarnings("deprecation")
@BeforeClass
public static void beforeClass() throws java.lang.Exception {
disconnectDS();
}
static void disconnectDS() {
DistributedSystem ds = InternalDistributedSystem.getConnectedInstance();
if (ds != null) {
ds.disconnect();
}
}
@Test
public void testInsertUpdateOnSimpleAndXAdsCommit() throws Exception {
Region currRegion = null;
Cache cache;
DistributedSystem ds = null;
int tblIDFld;
String tblNameFld;
String tblName;
String tableName = null;
// boolean to_continue = true;
final int XA_INSERTS = 3;
final int SM_INSERTS = 1;
// call to init method
try {
Properties props = new Properties();
String path= TestUtil.getResourcePath(CacheUtils.class, "cachejta.xml");
props.setProperty("cache-xml-file", path);
ds = connect(props);
tableName = CacheUtils.init(ds, "JTATest");
// System.out.println ("Table name: " + tableName);
tblName = tableName;
if (tableName == null || tableName.equals("")) {
// to_continue = false;
fail(" table name not created, Aborting test...");
}
} catch (Exception e) {
// to_continue = false;
fail(" Aborting test at set up...[" + e + "]", e);
}
System.out.println("init for testscenario 1 Successful!");
// test task
cache = CacheUtils.getCache();
tblName = tableName;
currRegion = cache.getRegion("/root");
tblIDFld = 1;
tblNameFld = "test1";
JTAUtils jtaObj = new JTAUtils(cache, currRegion);
// to delete all rows inserted in creatTable () of CacheUtils class
// deleteRows method of JTAUtils class is used.
jtaObj.deleteRows(tblName);
// initialize cache and get user transaction
Context ctx = cache.getJNDIContext();
UserTransaction ta = null;
Connection xa_conn = null;
Connection sm_conn = null;
try {
ta = (UserTransaction) ctx.lookup("java:/UserTransaction");
} catch (NamingException e) {
fail(" fail in user txn lookup ", e);
}
try {
// get the SimpleDataSource before the transaction begins
DataSource sds = (DataSource) ctx.lookup("java:/SimpleDataSource");
// Begin the user transaction
ta.begin();
// Obtain XAPooledDataSource
DataSource da = (DataSource) ctx.lookup("java:/XAPooledDataSource");
// obtain connection from SimpleDataSource and XAPooledDataSource
xa_conn = da.getConnection();
sm_conn = sds.getConnection();
Statement xa_stmt = xa_conn.createStatement();
Statement sm_stmt = sm_conn.createStatement();
// perform inserts and updates using both viz. Simple and XA DataSources
// String sqlSTR = "insert into " + tblName + " values (" + tblIDFld + ","
// + "'" + tblNameFld + "'" + ")" ;
String sqlSTR;
// insert XA_INSERTS rows into timestamped table
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + i;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
xa_stmt.executeUpdate(sqlSTR);
}
// insert SM_INSERTS rows into timestamped table
for (int j = 0; j < SM_INSERTS; j++) {
tblIDFld = tblIDFld + j + 1;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
sm_stmt.executeUpdate(sqlSTR);
}
// close the Simple and XA statements
xa_stmt.close();
sm_stmt.close();
// close the connections
xa_conn.close();
sm_conn.close();
// commit the transaction
ta.commit();
System.out.println("Rows are committed in the database");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
fail(" failed ", e);
} finally {
if (xa_conn != null) {
try {
// close the connections
xa_conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// get the number of rows in time stamped table
// using getRows method of JTAUtils
try {
int num_rows = jtaObj.getRows(tblName);
System.out.println(
"\nNumber of rows in Table under tests are: " + num_rows);
// determine what got commited and what not
switch (num_rows) {
case SM_INSERTS + XA_INSERTS:
System.out.println(
"Both Simple and XA DataSource transactions got committed!!");
break;
case SM_INSERTS:
System.out.println(
"Only Simple DataSource transactions got committed!");
break;
case XA_INSERTS:
System.out.println("Only XA DataSource transactions got committed!");
break;
default:
System.out.println(
"Looks like that things are messed up...look into it");
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
System.out.println("test task for testScenario1 Succeessful");
// destroying table
try {
System.out.println("Destroying table: " + tblName);
CacheUtils.destroyTable(tblName);
System.out.println("Closing cache...");
System.out.println("destroyTable for testscenario 1 Successful!");
} catch (Exception e) {
fail(" failed during tear down of this test...", e);
} finally {
CacheUtils.closeCache();
// CacheUtils.ds.disconnect();
ds.disconnect();
}
}
/**
* The following test scenario is to test rollback. In this test scenario it
* is tested that if transactions are rolled back then XA datasource
* transactions should be rolled back andSimple datasource transactions should
* get committed
*/
@Test
public void testInsertUpdateOnSimpleAndXAdsRollback() throws Exception {
Region currRegion = null;
Cache cache;
DistributedSystem ds = null;
int tblIDFld;
String tblNameFld;
String tblName;
String tableName = null;
// boolean to_continue = true;
final int XA_INSERTS = 3;
final int SM_INSERTS = 1;
// call to init method
try {
Properties props = new Properties();
String path= TestUtil.getResourcePath(CacheUtils.class, "cachejta.xml");
props.setProperty("cache-xml-file", path);
ds = connect(props);
tableName = CacheUtils.init(ds, "JTATest");
System.out.println("Table name: " + tableName);
tblName = tableName;
if (tableName == null || tableName.equals("")) {
// to_continue = false;
fail(" table name not created, Aborting test...");
}
} catch (Exception e) {
// to_continue = false;
fail(" Aborting test at set up...[" + e + "]", e);
}
System.out.println("init for testscenario 2 Successful!");
// test task
cache = CacheUtils.getCache();
tblName = tableName;
currRegion = cache.getRegion("/root");
tblIDFld = 1;
tblNameFld = "test2";
JTAUtils jtaObj = new JTAUtils(cache, currRegion);
// to delete all rows inserted in creatTable () of CacheUtils class
// deleteRows method of JTAUtils class is used.
jtaObj.deleteRows(tblName);
// initialize cache and get user transaction
Context ctx = cache.getJNDIContext();
UserTransaction ta = null;
Connection xa_conn = null;
Connection sm_conn = null;
try {
ta = (UserTransaction) ctx.lookup("java:/UserTransaction");
} catch (NamingException e) {
fail(" fail in user txn lookup ", e);
}
try {
// get the SimpleDataSource before the transaction begins
DataSource sds = (DataSource) ctx.lookup("java:/SimpleDataSource");
// Begin the user transaction
ta.begin();
// Obtain XAPooledDataSource
DataSource da = (DataSource) ctx.lookup("java:/XAPooledDataSource");
// obtain connection from SimpleDataSource and XAPooledDataSource
xa_conn = da.getConnection();
sm_conn = sds.getConnection();
Statement xa_stmt = xa_conn.createStatement();
Statement sm_stmt = sm_conn.createStatement();
// perform inserts and updates using both viz. Simple and XA DataSources
// String sqlSTR = "insert into " + tblName + " values (" + tblIDFld + ","
// + "'" + tblNameFld + "'" + ")" ;
String sqlSTR;
// insert XA_INSERTS rows into timestamped table
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + i;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
xa_stmt.executeUpdate(sqlSTR);
}
// insert SM_INSERTS rows into timestamped table
for (int j = 0; j < SM_INSERTS; j++) {
tblIDFld = tblIDFld + j + 1;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
sm_stmt.executeUpdate(sqlSTR);
}
// close the Simple and XA statements
xa_stmt.close();
sm_stmt.close();
// close the connections
xa_conn.close();
sm_conn.close();
// rollback the transaction
ta.rollback();
System.out.println("Rows are rolled back in the database");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
fail(" failed ", e);
} finally {
if (xa_conn != null) {
try {
// close the connections
xa_conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// get the number of rows in time stamped table
// using getRows method of JTAUtils
try {
int num_rows = jtaObj.getRows(tblName);
System.out.println(
"\nNumber of rows in Table under tests are: " + num_rows);
// determine what got commited and what not
switch (num_rows) {
case 0:
System.out.println(
"Both Simple and XA DataSource transactions got rolled back!!");
break;
case SM_INSERTS:
System.out.println(
"Only Simple DataSource transactions got committed!");
break;
case XA_INSERTS:
System.out.println("Only XA DataSource transactions got committed!");
break;
default:
System.out.println(
"Looks like that things are messed up...look into it");
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
System.out.println("test task for testScenario2 Succeessful");
// destroying table
try {
System.out.println("Destroying table: " + tblName);
CacheUtils.destroyTable(tblName);
System.out.println("Closing cache...");
System.out.println("destroyTable for testscenario 2 Successful!");
} catch (Exception e) {
fail(" failed during tear down of this test...", e);
} finally {
CacheUtils.closeCache();
// CacheUtils.ds.disconnect();
ds.disconnect();
}
}
/*
* The following test scenarion is to test the the behaviour ofXA DataSource
* if obtained outside the user transaction and transaction rolled back.
*/
/*
* public static void testInsertsOnTwoXAdsRollback () { Host host =
* Host.getHost (0); VM vm0 = host.getVM (0); vm0.invoke
* (DataSourceJTAJUnitTest.class, "Scenario3"); }
*
* public static void Scenario3 () throws Exception { Region currRegion=null;
* Cache cache; int tblIDFld; String tblNameFld; String tblName; String
* tableName=null; boolean to_continue = true; final int XA_INSERTS_BEFORE=3;
* final int XA_INSERTS_AFTER=2;
*
* //call to init method try { tableName = CacheUtils.init("JTATest");
* //System.out.println ("Table name: " + tableName); tblName = tableName;
*
* if (tableName == null || tableName.equals ("")) { to_continue = false; fail
* (" table name not created, Aborting test..."); } } catch (Exception e) {
* to_continue = false; fail (" Aborting test at set up...[" + e + "]"); }
*
* System.out.println("init for testscenario 3 Successful!");
*
* //test task cache = CacheUtils.getCache (); tblName = tableName; currRegion
* = cache.getRegion("/root"); tblIDFld = 1; tblNameFld = "test3"; JTAUtils
* jtaObj = new JTAUtils (cache, currRegion);
*
* //to delete all rows inserted in creatTable () of CacheUtils class
* //deleteRows method of JTAUtils class is used. int rowsDeleted =
* jtaObj.deleteRows(tblName);
*
* //initialize cache and get user transaction Context ctx =
* cache.getJNDIContext(); UserTransaction ta = null; Connection
* xaConnBeforeTxn = null; Connection xaConnAfterTxn = null; try { ta =
* (UserTransaction)ctx.lookup("java:/UserTransaction");
*
* } catch (NamingException e) { fail (" fail in user txn lookup " + e); }
*
* try{
*
* //get the XADataSource before the transaction begins DataSource
* xads=(DataSource)ctx.lookup("java:/XAPooledDataSource");
* System.out.println("XA data source obtained outside transaction");
*
* //Begin the user transaction ta.begin();
* System.out.println("Transaction begun successfully");
*
* //Obtain XAPooledDataSource DataSource da =
* (DataSource)ctx.lookup("java:/XAPooledDataSource");
* System.out.println("XA data source obtained within transaction");
*
* //obtain connection from SimpleDataSource and XAPooledDataSource
* xaConnAfterTxn = da.getConnection();
* System.out.println("Done with xaConnAfterTxn"); xaConnBeforeTxn =
* xads.getConnection(); //xaConnAfterTxn = da.getConnection();
* System.out.println("Done with xaConnBeforeTxn");
*
* Statement stmtBefore = xaConnBeforeTxn.createStatement(); Statement
* stmtAfter = xaConnAfterTxn.createStatement();
* System.out.println("Done with both the statements");
*
* //perform inserts and updates using both XA DataSources //String sqlSTR =
* "insert into " + tblName + " values (" + tblIDFld + "," + "'" + tblNameFld
* + "'" + ")" ;
*
* String sqlSTR;
*
* //insert XA_INSERTS rows into timestamped table for (int i=0;
* i<XA_INSERTS_BEFORE;i++){ tblIDFld=tblIDFld+i; sqlSTR = "insert into " +
* tblName + " values (" + tblIDFld + "," + "'" + tblNameFld + "'" + ")" ;
* stmtBefore.executeUpdate(sqlSTR); }
* System.out.println("Done with inserts by stmtBefore");
*
* //insert SM_INSERTS rows into timestamped table for (int j=0;
* j<XA_INSERTS_AFTER;j++){ tblIDFld=tblIDFld+j+5; sqlSTR = "insert into " +
* tblName + " values (" + tblIDFld + "," + "'" + tblNameFld + "'" + ")" ;
* stmtAfter.executeUpdate(sqlSTR); }
* System.out.println("Done with inserts by stmtAfter");
*
* //close both the XA statements stmtBefore.close(); stmtAfter.close();
* System.out.println("Closed both the statements");
*
*
* //close the connections xaConnBeforeTxn.close(); xaConnAfterTxn.close();
* System.out.println("Closed both the connections");
*
*
* //rollback the transaction ta.rollback ();
* System.out.println("Rows are rolled back in the database"); } catch
* (SQLException e) { e.printStackTrace(); } catch (Exception e){ fail
* (" failed " + e); } finally { if (xaConnBeforeTxn != null || xaConnAfterTxn
* != null) { try { //close the connections xaConnBeforeTxn.close();
* xaConnAfterTxn.close(); System.out.println("Closed both the statements");
* } catch (Exception e) { e.printStackTrace(); } } } //get the number of rows
* in time stamped table //using getRows method of JTAUtils
*
* try{ int num_rows = jtaObj.getRows(tblName);
* System.out.println("\nNumber of rows in Table under tests are: "
* +num_rows);
*
* //determine what got commited and what not
*
* switch (num_rows) { case 0:
* System.out.println("Both XA DataSource transactions got rolled back!!");
* break;
*
* case XA_INSERTS_BEFORE: System.out.println(
* "Only XA DataSource transactions got committed...which was obtained before txn!"
* ); break;
*
* case XA_INSERTS_AFTER:
* System.out.println("Only XA DataSource transactions within txn got committed!"
* ); break;
*
* default:
* System.out.println("Looks like that things are messed up...look into it");
*
* }
*
* } catch (SQLException sqle){ sqle.printStackTrace(); }
*
* System.out.println("test task for testScenario3 Succeessful");
*
* //destroying table try { System.out.println ("Destroying table: " +
* tblName); CacheUtils.destroyTable(tblName); System.out.println
* ("Closing cache...");
* System.out.println("destroyTable for testscenario 3 Successful!"); } catch
* (Exception e) { fail (" failed during tear down of this test..." + e); }
* finally { CacheUtils.closeCache(); CacheUtils.ds.disconnect(); } }//end of
* testscenario3
*/
/**
* The following test is to verify that any DDL command should not commit the
* inserts before it...if rollback is issued for the transaction
*/
@Test
public void testInsertsDDLRollback() throws Exception {
Region currRegion = null;
Cache cache;
DistributedSystem ds = null;
int tblIDFld;
String tblNameFld;
String tblName;
String tableName = null;
// boolean to_continue = true;
final int XA_INSERTS = 3;
// call to init method
try {
Properties props = new Properties();
String path= TestUtil.getResourcePath(CacheUtils.class, "cachejta.xml");
props.setProperty("cache-xml-file", path);
ds = connect(props);
tableName = CacheUtils.init(ds, "JTATest");
// System.out.println ("Table name: " + tableName);
tblName = tableName;
if (tableName == null || tableName.equals("")) {
// to_continue = false;
fail(" table name not created, Aborting test...");
}
} catch (Exception e) {
// to_continue = false;
fail(" Aborting test at set up...[" + e + "]", e);
}
System.out.println("init for testscenario 4 Successful!");
// test task
cache = CacheUtils.getCache();
tblName = tableName;
currRegion = cache.getRegion("/root");
tblIDFld = 1;
tblNameFld = "test4";
JTAUtils jtaObj = new JTAUtils(cache, currRegion);
// to delete all rows inserted in creatTable () of CacheUtils class
// deleteRows method of JTAUtils class is used.
jtaObj.deleteRows(tblName);
// initialize cache and get user transaction
Context ctx = cache.getJNDIContext();
UserTransaction ta = null;
Connection xaCon = null;
try {
ta = (UserTransaction) ctx.lookup("java:/UserTransaction");
} catch (NamingException e) {
fail(" fail in user txn lookup ", e);
}
try {
// Begin the user transaction
ta.begin();
// Obtain XAPooledDataSource
DataSource da = (DataSource) ctx.lookup("java:/XAPooledDataSource");
// obtain connection from SimpleDataSource and XAPooledDataSource
xaCon = da.getConnection();
Statement stmt = xaCon.createStatement();
// perform inserts and updates using both XA DataSources
// String sqlSTR = "insert into " + tblName + " values (" + tblIDFld + ","
// + "'" + tblNameFld + "'" + ")" ;
String sqlSTR;
// insert XA_INSERTS rows into timestamped table
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + i;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
stmt.executeUpdate(sqlSTR);
}
// insert SM_INSERTS rows into timestamped table
String sql = "create table TEST (id integer, name varchar(50))";
stmt.executeUpdate(sql);
sql = "drop table TEST";
stmt.executeUpdate(sql);
// close both the XA statements
stmt.close();
// close the connections
xaCon.close();
// rollback the transaction
ta.rollback();
System.out.println("Rows are rolled back in the database");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
fail(" failed ", e);
} finally {
if (xaCon != null) {
try {
// close the connections
xaCon.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// get the number of rows in time stamped table
// using getRows method of JTAUtils
try {
int num_rows = jtaObj.getRows(tblName);
System.out.println(
"\nNumber of rows in Table under tests are: " + num_rows);
// determine what got commited and what not
switch (num_rows) {
case 0:
System.out.println("Nothing is committed to database");
break;
case XA_INSERTS:
System.out.println(
"Inserts are committed to database...they should not!!:-(");
break;
default:
System.out.println(
"Looks like that things are messed up...look into it");
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
System.out.println("test task for testScenario4 Succeessful");
// destroying table
try {
System.out.println("Destroying table: " + tblName);
CacheUtils.destroyTable(tblName);
System.out.println("Closing cache...");
System.out.println("destroyTable for testscenario 4 Successful!");
} catch (Exception e) {
fail(" failed during tear down of this test...", e);
} finally {
CacheUtils.closeCache();
// CacheUtils.ds.disconnect();
ds.disconnect();
}
}
/**
* This is to test that if commit is issues thencommit happen for all the XA
* Resources operations...involved in the transaction
*/
@Test
public void testMultipleXAResourceCommit() throws Exception {
Region currRegion = null;
Cache cache;
DistributedSystem ds = null;
int tblIDFld;
String tblNameFld;
String tblName;
String tableName = null;
// boolean to_continue = true;
final int XA_INSERTS = 3;
// call to init method
try {
Properties props = new Properties();
String path= TestUtil.getResourcePath(CacheUtils.class, "cachejta.xml");
props.setProperty("cache-xml-file", path);
ds = connect(props);
tableName = CacheUtils.init(ds, "JTATest");
// System.out.println ("Table name: " + tableName);
tblName = tableName;
if (tableName == null || tableName.equals("")) {
// to_continue = false;
fail(" table name not created, Aborting test...");
}
} catch (Exception e) {
// to_continue = false;
fail(" Aborting test at set up...[" + e + "]", e);
}
System.out.println("init for testscenario 5 Successful!");
// test task
cache = CacheUtils.getCache();
tblName = tableName;
currRegion = cache.getRegion("/root");
tblIDFld = 1;
tblNameFld = "test5";
JTAUtils jtaObj = new JTAUtils(cache, currRegion);
// to delete all rows inserted in creatTable () of CacheUtils class
// deleteRows method of JTAUtils class is used.
jtaObj.deleteRows(tblName);
// initialize cache and get user transaction
Context ctx = cache.getJNDIContext();
UserTransaction ta = null;
Connection xaCon1 = null, xaCon2 = null, xaCon3 = null;
try {
ta = (UserTransaction) ctx.lookup("java:/UserTransaction");
} catch (NamingException e) {
fail(" fail in user txn lookup ", e);
}
try {
// Begin the user transaction
ta.begin();
// Operation with first XA Resource
DataSource da1 = (DataSource) ctx.lookup("java:/XAPooledDataSource");
xaCon1 = da1.getConnection();
Statement stmt1 = xaCon1.createStatement();
String sqlSTR;
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + i;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
stmt1.executeUpdate(sqlSTR);
}
stmt1.close();
xaCon1.close();
// Operation with second XA Resource
DataSource da2 = (DataSource) ctx.lookup("java:/XAPooledDataSource");
xaCon2 = da2.getConnection();
Statement stmt2 = xaCon2.createStatement();
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + i + 5;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
stmt2.executeUpdate(sqlSTR);
}
stmt2.close();
xaCon2.close();
// Operation with third XA Resource
DataSource da3 = (DataSource) ctx.lookup("java:/XAPooledDataSource");
xaCon3 = da3.getConnection();
Statement stmt3 = xaCon3.createStatement();
for (int i = 0; i < XA_INSERTS; i++) {
tblIDFld = tblIDFld + 10;
sqlSTR = "insert into " + tblName + " values (" + tblIDFld + "," + "'"
+ tblNameFld + "'" + ")";
stmt3.executeUpdate(sqlSTR);
}
stmt3.close();
xaCon3.close();
// commit the transaction
ta.commit();
System.out.println("Rows are rolled back in the database");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
fail(" failed ", e);
} finally {
if (xaCon1 != null || xaCon2 != null || xaCon3 != null) {
try {
// close the connections
xaCon1.close();
xaCon2.close();
xaCon3.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// get the number of rows in time stamped table
// using getRows method of JTAUtils
try {
int num_rows = jtaObj.getRows(tblName);
System.out.println(
"\nNumber of rows in Table under tests are: " + num_rows);
// determine what got commited and what not
switch (num_rows) {
case 0:
System.out.println("Nothing is committed to database");
break;
case 3 * XA_INSERTS:
System.out.println(
"All inserts successfully are committed to database");
break;
default:
System.out.println(
"Looks like that things are messed up...look into it");
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
System.out.println("test task for testScenario5 Succeessful");
// destroying table
try {
System.out.println("Destroying table: " + tblName);
CacheUtils.destroyTable(tblName);
System.out.println("Closing cache...");
System.out.println("destroyTable for testscenario 5 Successful!");
} catch (Exception e) {
fail(" failed during tear down of this test...", e);
} finally {
CacheUtils.closeCache();
// CacheUtils.ds.disconnect();
ds.disconnect();
}
}
/*
* If time of one of the XA Resources exceeds the blocking time outthen all
* the operation for that transaction should be rolled backeven though test
* tries to commit those
*/
/*
* public static void testXAResourceBtoCommit () { Host host = Host.getHost
* (0); VM vm0 = host.getVM (0); vm0.invoke (DataSourceJTAJUnitTest.class,
* "Scenario6"); }
*
* public static void Scenario6 () throws Exception { Region currRegion=null;
* Cache cache; int tblIDFld; String tblNameFld; String tblName; String
* tableName=null; boolean to_continue = true; final int XA_INSERTS=3;
*
* //call to init method try { tableName = CacheUtils.init("JTATest");
* //System.out.println ("Table name: " + tableName); tblName = tableName;
*
* if (tableName == null || tableName.equals ("")) { to_continue = false; fail
* (" table name not created, Aborting test..."); } } catch (Exception e) {
* to_continue = false; fail (" Aborting test at set up...[" + e + "]"); }
*
* System.out.println("init for testscenario 6 Successful!");
*
* //test task cache = CacheUtils.getCache (); tblName = tableName; currRegion
* = cache.getRegion("/root"); tblIDFld = 1; tblNameFld = "test6"; JTAUtils
* jtaObj = new JTAUtils (cache, currRegion);
*
* //to delete all rows inserted in creatTable () of CacheUtils class
* //deleteRows method of JTAUtils class is used. int rowsDeleted =
* jtaObj.deleteRows(tblName);
*
* //initialize cache and get user transaction Context ctx =
* cache.getJNDIContext(); UserTransaction ta = null; Connection
* xaCon1=null,xaCon2=null,xaCon3=null; try { ta =
* (UserTransaction)ctx.lookup("java:/UserTransaction");
*
* } catch (NamingException e) { fail (" fail in user txn lookup " + e); }
*
* try{
*
* //Begin the user transaction ta.begin();
*
* //Operation with first XA Resource DataSource da1 =
* (DataSource)ctx.lookup("java:/XAPooledDataSource"); xaCon1 =
* da1.getConnection(); Statement stmt1 = xaCon1.createStatement(); String
* sqlSTR; for (int i=0; i<XA_INSERTS;i++){ tblIDFld=tblIDFld+i; sqlSTR =
* "insert into " + tblName + " values (" + tblIDFld + "," + "'" + tblNameFld
* + "'" + ")" ; stmt1.executeUpdate(sqlSTR); } stmt1.close(); xaCon1.close();
*
* //Operation with second XA Resource DataSource da2 =
* (DataSource)ctx.lookup("java:/XAPooledDataSource"); xaCon2 =
* da2.getConnection(); Statement stmt2 = xaCon2.createStatement(); for (int
* i=0; i<XA_INSERTS;i++){ tblIDFld=tblIDFld+i+5; sqlSTR = "insert into " +
* tblName + " values (" + tblIDFld + "," + "'" + tblNameFld + "'" + ")" ;
* stmt2.executeUpdate(sqlSTR); } stmt2.close(); xaCon2.close();
*
* //Operation with third XA Resource DataSource da3 =
* (DataSource)ctx.lookup("java:/XAPooledDataSource"); xaCon3 =
* da3.getConnection(); Statement stmt3 = xaCon3.createStatement(); for (int
* i=0; i<XA_INSERTS;i++){ tblIDFld=tblIDFld+ 10; sqlSTR = "insert into " +
* tblName + " values (" + tblIDFld + "," + "'" + tblNameFld + "'" + ")" ;
* stmt3.executeUpdate(sqlSTR); } Thread.sleep(22*1000); //stmt3.close();
* //xaCon3.close();
*
* //commit the transaction ta.commit ();
* System.out.println("Rows are rolled back in the database");
*
* } catch (SQLException e) { e.printStackTrace(); } catch (Exception e){ fail
* (" failed " + e); } finally { if (xaCon1!=null || xaCon2!=null ||
* xaCon3!=null) { try { //close the connections xaCon1.close();
* xaCon2.close(); xaCon3.close(); } catch (Exception e) {
* e.printStackTrace(); } } } //get the number of rows in time stamped table
* //using getRows method of JTAUtils
*
* try{ int num_rows = jtaObj.getRows(tblName);
* System.out.println("\nNumber of rows in Table under tests are: "
* +num_rows);
*
* //determine what got commited and what not
*
* switch (num_rows) { case 0:
* System.out.println("Nothing is committed to database"); break;
*
* case 3*XA_INSERTS: System.out.println(
* "All inserts successfully are committed to database...this is NOT EXPECTED"
* ); break;
*
* default:
* System.out.println("Looks like that things are messed up...look into it");
*
* }
*
* } catch (SQLException sqle){ sqle.printStackTrace(); }
*
* System.out.println("test task for testScenario6 Succeessful");
*
* //destroying table try { System.out.println ("Destroying table: " +
* tblName); CacheUtils.destroyTable(tblName); System.out.println
* ("Closing cache...");
* System.out.println("destroyTable for testscenario 6 Successful!"); } catch
* (Exception e) { fail (" failed during tear down of this test..." + e); }
* finally { CacheUtils.closeCache(); CacheUtils.ds.disconnect(); } }//end of
* testscenario6
*/
private static DistributedSystem connect(Properties props) {
props.setProperty("mcast-port", "0");
props.setProperty("locators", "");
return DistributedSystem.connect(props);
}
private static void fail(String str, Throwable thr) {
throw new AssertionError(str, thr);
}
private static void fail(String str) {
throw new AssertionError(str);
}
}