package com.hp.mwtests.ts.jdbc.basic;
import static org.junit.Assert.fail;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.DriverManager;
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 org.junit.Before;
import org.junit.Test;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class StableConnections {
private static final String DB_USER1 = "postgres";
private static final String DB_HOST = "127.0.0.1";
private static final String DB_SID = "postgres";
@Before
public void setup() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, NamingException, SQLException {
System.setProperty("java.naming.factory.initial",
"org.apache.naming.java.javaURLContextFactory");
System.setProperty("java.naming.factory.url.pkgs", "org.apache.naming");
getDataSource(DB_USER1);
}
@Test
public void test() throws SQLException {
for (int i = 0; i < 2; i++) {
try (Connection connection = DriverManager.getConnection("jdbc:arjuna:java:/comp/env/jdbc/" + DB_USER1, DB_USER1, DB_USER1)) {
PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) FROM pg_stat_activity");
ResultSet resultSet = statement.executeQuery();
if (!resultSet.next() || resultSet.getLong(1) != 1) {
fail();
}
}
}
}
private static DataSource getDataSource(String user)
throws NamingException, SQLException, InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException,
SecurityException, ClassNotFoundException {
InitialContext initialContext = prepareInitialContext();
Class clazz = Class.forName("org.postgresql.xa.PGXADataSource");
XADataSource xaDataSource = (XADataSource) clazz.newInstance();
clazz.getMethod("setServerName", new Class[] { String.class }).invoke(
xaDataSource, new Object[] { DB_HOST });
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[] { 5432 });
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;
}
}