/*
* JBoss, Home of Professional Open Source
* Copyright 2007, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2005-2006,
* @author JBoss Inc.
*/
/***************************************************************/
/* */
/* Name : LynxJDBCPerfTest.java */
/* */
/* Description : Version of the original test from US company */
/* Lynx which has been modified for the QA test */
/* suite. */
/* */
/* Test performs x inserts using JTA interface */
/* and checks time taken. Test passes if */
/* throughput if greater than a specified value. */
/* */
/* NOTE : Lynx test was written for Oracle. */
/***************************************************************/
package org.jboss.jbossts.qa.Issues0001Clients;
import org.jboss.jbossts.qa.Utils.JDBCProfileStore;
import org.jboss.jbossts.qa.Utils.OAInterface;
import org.jboss.jbossts.qa.Utils.ORBInterface;
import javax.transaction.TransactionManager;
import java.sql.*;
import java.util.Properties;
public class LynxJDBCPerfTest extends Thread
{
private java.sql.Connection _dbConn;
private PreparedStatement _prepStmt;
static private TransactionManager _txMgr = null;
static private long _start;
static private long _end;
static private double _iterPerSec;
static private double _expected_iterPerSec = 30;
static private double _noOfIterations = 1000;
private long _count = 0;
// Print out test stats to client err file.
private void printStats()
{
try
{
_iterPerSec = ((double) _count) / ((double) (_end - _start)) * 1000.0;
System.err.println("Messages Received : " + _count);
System.err.println("Elapsed time : " +
(_end - _start) + " ms");
System.err.println("Expected Performance : " +
((int) _expected_iterPerSec) + " iterations/sec");
System.err.println("Actual Performance : " +
((int) _iterPerSec) + " iterations/sec");
}
catch (Exception ex)
{
System.err.println("Exception occurred in printStats(), ex: " + ex);
}
}
// Setup DB connection and create test table.
private void initSequeLink(String profileName)
{
try
{
// REGISTER DRIVER
int numberOfDrivers = JDBCProfileStore.numberOfDrivers(profileName);
for (int index = 0; index < numberOfDrivers; index++)
{
String driver = JDBCProfileStore.driver(profileName, index);
Class.forName(driver);
}
String databaseURL = JDBCProfileStore.databaseURL(profileName);
String databaseUser = JDBCProfileStore.databaseUser(profileName);
String databasePassword = JDBCProfileStore.databasePassword(profileName);
String databaseDynamicClass = JDBCProfileStore.databaseDynamicClass(profileName);
// Get DB connection.
Connection connection;
if (databaseDynamicClass != null)
{
Properties databaseProperties = new Properties();
databaseProperties.put(com.arjuna.ats.jdbc.TransactionalDriver.userName, databaseUser);
databaseProperties.put(com.arjuna.ats.jdbc.TransactionalDriver.password, databasePassword);
databaseProperties.put(com.arjuna.ats.jdbc.TransactionalDriver.dynamicClass, databaseDynamicClass);
_dbConn = DriverManager.getConnection(databaseURL, databaseProperties);
}
else
{
_dbConn = DriverManager.getConnection(databaseURL, databaseUser, databasePassword);
}
ResultSet rs = null;
Statement st = _dbConn.createStatement();
// Create TEST table (drop if already exists).
rs = st.executeQuery("SELECT * FROM USER_TABLES " +
"WHERE TABLE_NAME = \'LYNX_TEST\'");
if (rs.next())
{
st.execute("DROP TABLE LYNX_TEST");
st.execute("DROP SEQUENCE LYNX_TESTSEQ");
}
st.execute("CREATE TABLE LYNX_TEST (id number(20) not null," +
"description varchar2 (2000)," +
"CONSTRAINT lynx_pk_id PRIMARY KEY (id) " +
"USING index storage (initial 10k next 10k))");
st.execute("CREATE SEQUENCE LYNX_TESTSEQ");
_prepStmt = _dbConn.prepareStatement("insert into LYNX_TEST values (LYNX_TESTSEQ.nextval, ?)");
}
catch (Exception e)
{
System.err.println(e);
}
}
// Perform actual test - insert x rows and record time taken.
public void doTest()
{
try
{
_start = System.currentTimeMillis();
_txMgr = com.arjuna.ats.jta.TransactionManager.transactionManager();
for (int i = 0; i < _noOfIterations; ++i)
{
_count++;
_txMgr.begin();
Statement _Stmt = _dbConn.createStatement();
String text = "12345678901234567890123456789012345678901234567890";
int tmpInt = _Stmt.executeUpdate("insert into TEST values (TESTSeq.nextval, '" + text + "')");
_Stmt.close();
_txMgr.commit();
}
_end = System.currentTimeMillis();
printStats();
}
catch (Exception ex)
{
ex.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args) throws Exception
{
// Process args.
if (args.length > 1)
{
_expected_iterPerSec = Float.parseFloat(args[1]);
}
if (args.length > 2)
{
_noOfIterations = Float.parseFloat(args[2]);
}
LynxJDBCPerfTest tester = new LynxJDBCPerfTest();
// Setup and perform test.
tester.startTransactionManager(args);
tester.initSequeLink(args[0]);
tester.doTest();
tester.shutdownTransactionManager();
// Output Passed if performance meets expections.
if ((_iterPerSec) > _expected_iterPerSec)
{
System.out.println("Passed");
}
else
{
System.out.println("Failed");
}
}
private void startTransactionManager(String[] args) throws Exception
{
ORBInterface.initORB(args, null);
OAInterface.initOA();
}
private void shutdownTransactionManager()
{
OAInterface.shutdownOA();
ORBInterface.shutdownORB();
}
}