package com.hp.mwtests.ts.jdbc.basic; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import javax.sql.XADataSource; import javax.transaction.UserTransaction; import org.junit.Ignore; import org.junit.Test; import org.springframework.jdbc.datasource.DriverManagerDataSource; import com.arjuna.ats.arjuna.common.arjPropertyManager; public class SimpleJdbcTest { private static final String DB_USER1 = "dtf11"; private static final String DB_USER2 = "dtf12"; private static final String DB_HOST = "tywin.eng.hst.ams2.redhat.com"; private static final String DB_SID = "orcl"; @Test public void test() throws Exception { arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier("1"); System.setProperty("java.naming.factory.initial", "org.apache.naming.java.javaURLContextFactory"); System.setProperty("java.naming.factory.url.pkgs", "org.apache.naming"); final DataSource dataSource1 = getDataSource(DB_USER1, "oracle: " + DB_USER1); final DataSource dataSource2 = getDataSource(DB_USER2, "oracle: " + DB_USER2); prepare(dataSource1); prepare(dataSource2); final UserTransaction userTransaction = com.arjuna.ats.jta.UserTransaction .userTransaction(); userTransaction.begin(); final Connection connection1 = dataSource1.getConnection(); final Connection connection2 = dataSource2.getConnection(); insert(connection1); insert(connection2); userTransaction.commit(); } private static void insert(Connection connection) throws SQLException { final PreparedStatement preparedStatement = connection .prepareStatement("INSERT INTO jta_test (some_string) VALUES ('test')"); preparedStatement.execute(); } private static void prepare(DataSource dataSource) throws SQLException { final Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection .prepareStatement("SELECT * FROM user_tables WHERE table_name = 'JTA_TEST'"); final ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { connection.prepareStatement("DROP TABLE jta_test").execute(); } connection.prepareStatement( "CREATE TABLE jta_test (some_string VARCHAR2(10))").execute(); } private static DataSource getDataSource(String user, String resourceName) throws NamingException, SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException { InitialContext initialContext = prepareInitialContext(); Class clazz = Class.forName("oracle.jdbc.xa.client.OracleXADataSource"); XADataSource xaDataSource = (XADataSource) clazz.newInstance(); clazz.getMethod("setDriverType", new Class[] { String.class }).invoke( xaDataSource, new Object[] { "thin" }); clazz.getMethod("setServerName", new Class[] { String.class }).invoke( xaDataSource, new Object[] { DB_HOST }); clazz.getMethod("setNetworkProtocol", new Class[] { String.class }) .invoke(xaDataSource, new Object[] { "tcp" }); clazz.getMethod("setDatabaseName", new Class[] { String.class }) .invoke(xaDataSource, new Object[] { DB_SID }); clazz.getMethod("setUser", new Class[] { String.class }).invoke( xaDataSource, new Object[] { user }); clazz.getMethod("setPassword", new Class[] { String.class }).invoke( xaDataSource, new Object[] { user }); clazz.getMethod("setPortNumber", new Class[] { int.class }).invoke( xaDataSource, new Object[] { 1521 }); final String name = "java:/comp/env/jdbc/" + user; initialContext.bind(name, xaDataSource); DriverManagerDataSource dataSource = new DriverManagerDataSource( "jdbc:arjuna:" + name); dataSource .setDriverClassName("com.arjuna.ats.jdbc.TransactionalDriver"); return dataSource; } private static InitialContext prepareInitialContext() throws NamingException { final InitialContext initialContext = new InitialContext(); try { initialContext.lookup("java:/comp/env/jdbc"); } catch (NamingException ne) { initialContext.createSubcontext("java:"); initialContext.createSubcontext("java:/comp"); initialContext.createSubcontext("java:/comp/env"); initialContext.createSubcontext("java:/comp/env/jdbc"); } return initialContext; } }