JDBC Benchmark

From PeformIQ Upgrade
Revision as of 18:52, 24 May 2008 by PeterHarding (talk | contribs)
Jump to navigation Jump to search

Packaged Benchmark

See http://www.performiq.com.au/kb/images/JDBCBench.tar

JDBCTest

An IBM Test - see web page...


//
//  DISCLAIMER OF WARRANTIES.
//  The following [enclosed] code is sample code created by IBM
//  Corporation. This sample code is not part of any standard or IBM
//  product and is provided to you solely for the purpose of assisting
//  you in the development of your applications.  The code is provided
//  "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
//  NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
//  FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
//  THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
//  for any damages arising out of your use of the sample code, even
//  if it has been advised of the possibility of such damages.
//
import java.sql.*;

import javax.sql.*;

import java.io.*;
import java.awt.*;
import java.awt.event.*;

public class jdbctest {

	public String driverclassname;
	public String DBURL;
	public String dbprefix = "jdbc:";
	public Connection con;
	public Statement stmt;
	public BufferedReader instream;
	public long operationTimer;

	public String response = "0";

	public String globaluid = null;
	public String globalpwd = null;

	public String dbhostname;
	public String dbport;
	public String  dbname;

	public	ClassLoader loader=null;
	public Class dsClass=null;
	ConnectionPoolDataSource ds=null;
	
	public static final int DATASOURCECONNECTIONS=10;


	// Capture window events...
	static private class FrameCloser extends WindowAdapter {
		public void windowClosing(WindowEvent we) {
			System.out.println("windowClosing..." + we);
			we.getWindow().dispose();
			System.exit(0);
		}
	}

	// Capture key events...
	static private class KeyInterceptor implements KeyListener {
		public void keyTyped(java.awt.event.KeyEvent ke) {
		}
		public void keyPressed(java.awt.event.KeyEvent ke) {
		}
		public void keyReleased(java.awt.event.KeyEvent ke) {
			// System.out.println("keyReleased..." + ke);
			if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
				TextField tf = (TextField) ke.getComponent();
				synchronized (tf) {
					tf.notify();
				}
			} // if enter key is pressed
		}
	}

	public static void main(String args[]) {
		System.out.println("JDBC Test starting...");

		jdbctest ct = new jdbctest();
		ct.init(args); // Loads jdbc driver
		ct.connect(); // sets connection
		if (ct.con == null) {
			System.out.println("Connection to " + ct.DBURL + " failed!");
			System.exit(33);
		}

		System.out.println("Connection Successful: " + ct.con);
		System.out.println(
		"Connection took " + ct.operationTimer + " milliseconds to complete");
		try {
			System.out.println("AutoCommit is: " + ct.con.getAutoCommit());
		} catch (SQLException s) {
			s.printStackTrace();
			System.out.println("Error code is: " + s.getErrorCode());
			System.out.println("SQLState is: " + s.getSQLState());
			System.exit(33);
		}
		do {
			try {	
				if (!(ct.response.equals("11")) && !(ct.response.equals("10")))
				{System.out.println("Create new statement...");
	    			ct.stmt = ct.con.createStatement();}
			} catch (SQLException se) {
				se.printStackTrace();
				System.out.println("Error code is: " + se.getErrorCode());
				System.out.println("SQLState is: " + se.getSQLState());
				System.exit(33);
			}
		} while (ct.process());
		try {
			if (ct.stmt != null) ct.stmt.close();
			ct.con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		// System.exit ???
		System.exit(33);

	}

	public void init(String args[]) {
		instream = new BufferedReader((new InputStreamReader(System.in)));

		while (driverclassname == null) {
			System.out.println(
			"Please respond:\n\t1 - For DB2\n\t2 - For DB2/Pure Network Client\n\t3 - For Oracle (thin) \n\t4 - For Oracle (oci8)\n\t5 - For Informix\n\t6 - For Sybase\n\t7 - For Cloudscape - (Local)\n\t8 - For Cloudscape - (RMI)\n\t9 - For SQLServer (Microsoft Driver)\n\t10 - For SQLServer (SequeLink driver)\n\t11 - For SQLServer (WebSphere embedded Connect JDBC driver)\n\t12 - For SQLServer(Data Direct Technologies Connect JDBC driver)");
			response = readLine();
			if (response.equals("1")) {
				driverclassname = "COM.ibm.db2.jdbc.app.DB2Driver";
				dbprefix += "db2:";
			} else
			if (response.equals("2")) {
				driverclassname = "COM.ibm.db2.jdbc.net.DB2Driver";
				dbprefix += "db2:";
			} else
			if (response.equals("3")) { //Thin Driver
				driverclassname = "oracle.jdbc.driver.OracleDriver";
				dbprefix += "oracle:thin:";
			} else
			if (response.equals("4")) { //Thick Driver
				driverclassname = "oracle.jdbc.driver.OracleDriver";
				dbprefix += "oracle:oci8:";
			}  else
			if (response.equals("5")) {
				driverclassname = "com.informix.jdbc.IfxDriver";
				dbprefix += "informix-sqli:";
			} else
			if (response.equals("6")) {
				driverclassname = "com.sybase.jdbc2.jdbc.SybDriver";
				dbprefix += "sybase:";
			} else
			if (response.equals("7")) {
				driverclassname = "COM.cloudscape.core.JDBCDriver";
				dbprefix += "cloudscape:";
			} else
			if (response.equals("8")) {
				driverclassname = "COM.cloudscape.core.RmiJdbcDriver";
				dbprefix += "cloudscape:rmi:";
			} else
			if (response.equals("9")) {
				driverclassname = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
				dbprefix += "microsoft:sqlserver:";
			} else
			if (response.equals("10")) {
	//			driverclassname = "com.merant.sequelink.jdbcx.datasource.SequeLinkDataSource";
				driverclassname = "com.ddtek.jdbcx.sequelink.SequeLinkDataSource";
	
				dbprefix += "sequelink:";
			} else
			if (response.equals("11")) {
				driverclassname = "com.ibm.websphere.jdbcx.sqlserver.SQLServerDataSource";
				dbprefix += "sequelink:";
			} else
			if (response.equals("12")) {
				driverclassname = "com.ddtek.jdbcx.sqlserver.SQLServerDataSource";
				dbprefix += "sequelink:";
			} else
			System.out.println("Invalid selection: specify an option 1-12.");
		}


		System.out.println("Loading jdbc driver: " + driverclassname);
		try {
			if (Integer.parseInt(response) < DATASOURCECONNECTIONS)
			{
				Class.forName(driverclassname);
				System.out.println(driverclassname + " was loaded successfully");
			}
			else
			{loader = Thread.currentThread().getContextClassLoader();
			if (loader == null)
			loader = ClassLoader.getSystemClassLoader();

			dsClass=loader.loadClass(driverclassname);
		}

	} catch (Exception e) {
		e.printStackTrace();
		System.out.println(
		"Please modify you classpath to include the class: " + driverclassname);

		System.out.println(
		"To be sure that you have this class in your classpath, issue:\n javap "
		+ driverclassname);
		System.exit(33);
	}

}

public void connect() {
	while ((DBURL == null) && (Integer.parseInt(response) < DATASOURCECONNECTIONS)) {
		System.out.println("Please enter connection URL info, e.g:");

		if (driverclassname.endsWith(".app.DB2Driver")) {
			System.out.println("jdbc:db2:dbname or dbname");
		} else
		if (driverclassname.endsWith(".net.DB2Driver")) {
			System.out.println(
			"jdbc:db2://<serverName>:<port>/<dbname> or //<serverName>:<port>/<dbName>");
		} else
		if (driverclassname.endsWith(".OracleDriver")) {

			if (response.equals("4")) {
				System.out.println(
				"jdbc:oracle:oci8:@<hostname>:<port>:<dbname> or @<hostname>:<port>:<dbname>");
			} else {
				System.out.println(
				"jdbc:oracle:thin:@<hostname>:<port>:<dbname> or @<hostname>:<port>:<dbname>");
			}

		} else
		if (driverclassname.endsWith(".IfxDriver"))
		System.out.println(
		"jdbc:informix-sqli://<hostname>:<port>/<dbname>:INFORMIXSERVER=<ifxservername>");
		else
		if (driverclassname.endsWith(".SybDriver"))
		System.out.println("jdbc:sybase:<dbProtocol>:<hostname>:<port>/<dbname>");

		else
		if (driverclassname.endsWith(".SQLServerDriver"))
		System.out.println("jdbc:microsoft:sqlserver://<hostname>:<port>;DatabaseName=<dbname>");
		else
		if (driverclassname.endsWith(".JDBCDriver"))
		System.out.println("jdbc:cloudscape:<dbname>;create=<true|false>");
		else
		if (driverclassname.endsWith(".RmiJdbcDriver"))
		System.out.println("jdbc:cloudscape:rmi://<hostname>:<rmi port>/<dbname> or //<hostname>:<rmi port>/<dbname");

		if (!(driverclassname.endsWith("SequeLinkDriver")))
		DBURL = readLine();
		else
		DBURL = "";
	}

	if (DBURL==null) DBURL="";

	if (!DBURL.startsWith(dbprefix))
	DBURL = dbprefix + DBURL;


	String userid = null;
	{
		if (Integer.parseInt(response) < 10)
			System.out.println("Please enter userid for connection to " + DBURL);
		else if (Integer.parseInt(response) < 13)
			System.out.println("Please enter userid for connection to Microsoft SQL Server:");
		userid = readLine();
		System.out.println("userid is: '" + userid + "'");
	}
	String password = null;
	if (userid != null && !userid.equals("")) {
		System.out.println(
		"Please enter password   "
		+ " =====>  WARNING: PASSWORD NOT HIDDEN   <====== ");
		System.out.println(
		"enter 'gui' instead of you password for a secure GUI prompt)");
		password = readLine();
		if (password.equalsIgnoreCase("gui"))
		password = getPassword(userid);
	}

	globaluid = userid;
	globalpwd = password;

	try {

		//per L3, DataSource approach is used with WS 4.x, so let's do it the same way
		if (Integer.parseInt(response) >= DATASOURCECONNECTIONS) {
			con = this.getDataSourceConnection(userid, password);
		} else { //non-SQLServer

			if (userid == null || userid.equals("")) {
				long start = System.currentTimeMillis();
				con = DriverManager.getConnection(DBURL);
				operationTimer = System.currentTimeMillis() - start;
			} else {
				long start = System.currentTimeMillis();
				con = DriverManager.getConnection(DBURL, userid, password);
				operationTimer = System.currentTimeMillis() - start;
			}

		}
	} catch (SQLException se) {
		se.printStackTrace();
		System.out.println("Error code is: " + se.getErrorCode());
		System.out.println("SQLState is: " + se.getSQLState());
		// See if we can help the user with diagnosing the problem:
		boolean network_connect_problem = false;

		if (driverclassname.equals("oracle.jdbc.driver.OracleDriver")) {
			if ((se.getSQLState() == null) && (se.getErrorCode() == 17002)) {
				System.out.println("Connection to the Oracle server failed.\n");
				System.out.println(
				"Unable to connect to @hostname:port specified in the DB URL.");
				network_connect_problem = true;
			}
		}

		if (driverclassname.equals("COM.ibm.db2.jdbc.net.DB2Driver")) {
			if ((se.getSQLState() == "08S01") && (se.getErrorCode() == -99999)) {
				System.out.println("Connection to the DB2 server failed.\n");
				System.out.println(
				"Unable to connect to //hostname:port specified in the DB URL.");
				System.out.println(
				"Verify that db2jstrt is running on the target host with the specified port as a parameter...");
				network_connect_problem = true;
			}
		}

		if (network_connect_problem) {
			System.out.println(
			"Verify that the host and port that you are connecting to are correct.");
			System.out.println(
			"Also verify that the host you are connecting to is listening on the specified port.");
			System.out.println("Hint: use telnet hostname port.");
			System.out.println(
			"\tIf you get connection refused then the host is not listening on the specified port.");
			System.out.println(
			"\tIf telnet simply hangs then the host is listening on the port.");
			System.out.println();
		}

	} // End catch connect exception

}

private Connection getDataSourceConnection(String userid, String password) {
	PooledConnection pooledConn = null;
	Connection conn = null;


	try {
		/*loader = Thread.currentThread().getContextClassLoader();
		if (loader == null)
		loader = ClassLoader.getSystemClassLoader();

		if (response.equals("10"))
		dsClass =
		loader.loadClass("com.merant.sequelink.jdbcx.datasource.SequeLinkDataSource");

		else if (response.equals("11"))
		dsClass =
		loader.loadClass("com.ibm.websphere.jdbcx.sqlserver.SQLServerDataSource");

		dsClass=loader.loadClass(driverclassname);

		*/

		ds = (ConnectionPoolDataSource) (dsClass.newInstance());

		System.out.println("enter database name:");
		dbname = readLine();

		dsClass.getMethod("setDatabaseName", new Class[] { String.class }).invoke(
		ds,
		new Object[] { dbname });

		System.out.println("enter port number:");
		dbport = readLine();

		dsClass.getMethod("setPortNumber", new Class[] { int.class }).invoke(
		ds,
		new Object[] { new Integer(dbport)});

		System.out.println("enter server name:");
		dbhostname = readLine();

		dsClass.getMethod("setServerName", new Class[] { String.class }).invoke(
		ds,
		new Object[] { dbhostname });

		dsClass.getMethod("setUser", new Class[] { String.class }).invoke(
		ds,
		new Object[] { userid });

		dsClass.getMethod("setPassword", new Class[] { String.class }).invoke(
		ds,
		new Object[] { password });

		long start = System.currentTimeMillis();
		pooledConn = ds.getPooledConnection();
		conn = pooledConn.getConnection();
		operationTimer = System.currentTimeMillis() - start;

		// Any use of the Connection must be done AFTER the unlock, or else it will fail
		// with a license verification error.

	} catch (SQLException se) {
		se.printStackTrace();
		System.out.println("Error code is: " + se.getErrorCode());
		System.out.println("SQLState is: " + se.getSQLState());
		// See if we can help the user with diagnosing the problem:

		System.out.println(
		"Verify that the host and port that you are connecting to are correct.");
		System.out.println(
		"Also verify that the host you are connecting to is listening on the specified port.");
		System.out.println("Hint: use telnet hostname port.");
		System.out.println(
		"\tIf you get connection refused then the host is not listening on the specified port.");
		System.out.println(
		"\tIf telnet simply hangs then the host is listening on the port.");
		//			System.out.println();

		return (null);

	} // End catch connect exception

	catch (Throwable th) {
		th.printStackTrace();
		return (null);
	} finally {
		//  if (conn != null)       try { conn.close(); }       catch (Throwable th) {}
		//  if (pooledConn != null) try { pooledConn.close(); } catch (Throwable th) {}

	}

	return (conn);

}


private Connection getDataSourceConnection() {
	PooledConnection pooledConn = null;
	Connection conn = null;

    System.out.println("getting data source connection...");


	try {

		long start = System.currentTimeMillis();
		pooledConn = ds.getPooledConnection();
		conn = pooledConn.getConnection();
		operationTimer = System.currentTimeMillis() - start;

		// Any use of the Connection must be done AFTER the unlock, or else it will fail
		// with a license verification error.

	} catch (SQLException se) {
		se.printStackTrace();
		System.out.println("Error code is: " + se.getErrorCode());
		System.out.println("SQLState is: " + se.getSQLState());
		// See if we can help the user with diagnosing the problem:

		System.out.println(
		"Verify that the host and port that you are connecting to are correct.");
		System.out.println(
		"Also verify that the host you are connecting to is listening on the specified port.");
		System.out.println("Hint: use telnet hostname port.");
		System.out.println(
		"\tIf you get connection refused then the host is not listening on the specified port.");
		System.out.println(
		"\tIf telnet simply hangs then the host is listening on the port.");
		//			System.out.println();

		return (null);

	} // End catch connect exception

	catch (Throwable th) {
		th.printStackTrace();
		return (null);
	} finally {
		//  if (conn != null)       try { conn.close(); }       catch (Throwable th) {}
		//  if (pooledConn != null) try { pooledConn.close(); } catch (Throwable th) {}

	}

	return (conn);

}



public String readLine() {
	String response = null;
	try {
		response = instream.readLine();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return response;
}

public boolean process() {

	String instring = null;
	if (!(response.equals("11")) &&  !(response.equals("10")))
	{
		while (instring == null) {
			System.out.println(
			"Please enter sql statement to execute...(q to quit)\n(or maxconn to test maximum connections possible to this database)");
			instring = readLine();
			if (instring.equals("q")) {
				System.out.println("Ok, quitting!");
				return false;
			} else
			if (instring.equals("maxconn")) {
				System.out.println("testing for maximum connections...");
				maxconn();
				return true;
			}

		}

	}

	else //special case with DataDirect driver, test connect only

	{
		while ((instring == null) || (!instring.equals("q")) && (!instring.equals("maxconn"))) {
			System.out.println(
			"Please enter q to quit\n(or maxconn to test maximum connections possible to this database)");
			instring = readLine();

		}

		if (instring.equals("maxconn")) {
			System.out.println("testing for maximum connections...");
			maxconn();
			return true;
		}

		else
		if (instring.equals("q")) {
			System.out.println("Ok, quitting!");
			return false;			}

			else System.out.println("Jdbctest only supports connection testing for this driver.");


		}

		boolean rc = false;
		try {
			long start = System.currentTimeMillis();
			rc = stmt.execute(instring);
			operationTimer = System.currentTimeMillis() - start;
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println(
		"Operation took " + operationTimer + " milliseconds to complete");
		ResultSet rs = null;

		System.out.println(
		"Just tried " + rc + " = stmt.execute(\"" + instring + "\");");

		if (rc) {
			try {
				System.out.println("Getting result set...");
				rs = stmt.getResultSet();
				ResultSetMetaData rsm = rs.getMetaData();
				// Display names of columns fetched
				int colcount = rsm.getColumnCount();
				System.out.println(colcount + " column(s) in result");
				int[] coltype = new int[colcount + 1]; // Do not slot 0
				for (int i = 1; i < colcount + 1; i++) {
					System.out.print(rsm.getColumnName(i) + "   ");
					coltype[i] = rsm.getColumnType(i);
				}

				System.out.println();
				System.out.println("-----------------------------------");

				while (rs.next()) {
					for (int j = 1; j < colcount + 1; j++) {
						if (j != 1)
						System.out.print(",");
						switch (coltype[j]) {
							case Types.TINYINT :
							System.out.print("" + rs.getShort(j));
							break;

							case Types.SMALLINT :
							System.out.print("" + rs.getShort(j));
							break;

							case Types.INTEGER :
							System.out.print("" + rs.getInt(j));
							break;

							case Types.BIGINT :
							System.out.print("" + rs.getLong(j));
							break;

							case Types.FLOAT :
							System.out.print("" + rs.getFloat(j));
							break;

							case Types.REAL :
							System.out.print("" + rs.getDouble(j));
							break;

							case Types.DOUBLE :
							System.out.print("" + rs.getDouble(j));
							break;

							case Types.NUMERIC :
							System.out.print("" + rs.getInt(j));
							break;

							case Types.DECIMAL :
							System.out.print("" + rs.getInt(j));
							break;

							case Types.CHAR :
							//              System.out.print(""+rs.getByte(j));
							System.out.print("" + rs.getString(j));
							break;

							case Types.VARCHAR :
							System.out.print("" + rs.getString(j));
							break;

							case Types.LONGVARCHAR :
							System.out.print("" + rs.getString(j));
							break;

							case Types.DATE :
							System.out.print("" + rs.getDate(j));
							break;

							case Types.TIME :
							System.out.print("" + rs.getTime(j));
							break;

							case Types.TIMESTAMP :
							System.out.print("" + rs.getTimestamp(j));
							break;

							case Types.BINARY :
							case Types.BIT :
							case Types.VARBINARY :
							case Types.LONGVARBINARY :
							byte b[] = rs.getBytes(j);
							for (int n = 0; n < b.length; n++)
							System.out.print("" + b[n] + "|");
							break;

							case Types.NULL :
							System.out.print("-");
							break;

							case Types.OTHER :
							System.out.print("OTHER");
							break;

							default :
							System.out.print("UNKNOWN-TYPE");
						}
					}
					System.out.println();

				}
				System.out.println();

				rs.close();
			} catch (SQLException se) {
				se.printStackTrace();
				System.out.println("Error code is: " + se.getErrorCode());
				System.out.println("SQLState is: " + se.getSQLState());
			}
		}

		return true;

	}

	String getPassword(String userid) {
		Frame f;
		Panel p;
		Label l;
		TextField tf;

		// Create the frame
		f = new Frame("Password Prompt for JDBC tester");
		f.setLocation(400, 400);
		f.setSize(350, 100);
		// Reister ourselves for 'Close' events
		f.addWindowListener(new FrameCloser());

		// Create the panel
		p = new Panel();
		f.add(p, "Center");
		l = new Label("Please enter password for Data Base user: " + userid);
		tf = new TextField(20);
		tf.setEchoChar('*');
		p.add(l, "Center");
		p.add(tf, "Center");
		try {
			f.show();
		} catch (Exception ex) {
			ex.printStackTrace();
			System.out.println(
			"Your ===> DISPLAY <=== Environment Variable is not exported properly.  Please correct and retry.");
		}

		try {
			Thread.sleep(1000);
		} catch (InterruptedException ie) {
		}
		f.show();
		tf.requestFocus();
		tf.addKeyListener(new KeyInterceptor());

		//   System.out.println("Waiting for password to be entered...");

		synchronized (tf) {
			try {
				tf.wait();
			} catch (InterruptedException e) {
			}
		}
		String password = tf.getText();
		f.transferFocus();
		f.dispose();
		return password;
	}

	public void maxconn() {

		Connection c[] = new Connection[125];

		System.out.println("1 connection assumed...looping...");

		int i;

		for (i = 0; i < 125; i++)
		try {
			if (globaluid == null || globaluid.equals("")) {

				if (Integer.parseInt(response) < DATASOURCECONNECTIONS)
				{
					long start = System.currentTimeMillis();
					c[i] = DriverManager.getConnection(DBURL);
					operationTimer = System.currentTimeMillis() - start;
				}
				else c[i]= getDataSourceConnection();
			} else {
				if (Integer.parseInt(response) < DATASOURCECONNECTIONS)
				{

					long start = System.currentTimeMillis();
					c[i] = DriverManager.getConnection(DBURL, globaluid, globalpwd);
					operationTimer = System.currentTimeMillis() - start;
				}

				else c[i]= getDataSourceConnection();

			}

			System.out.println("Connection Successful: " + c[i]);
			System.out.println(
			"Connection "
			+ (i + 2)
			+ " took "
			+ operationTimer
			+ " milliseconds to complete");
		} catch (SQLException se) {
			se.printStackTrace();
			System.out.println("Error code is: " + se.getErrorCode());
			System.out.println("SQLState is: " + se.getSQLState());
			i--;
			break;
		}
		
		catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
			i--;
			break;
		}

		System.out.println(
		"Maximum connections to DB:" + DBURL + " is " + (i + 2) + ".");
		System.out.println("closing all connections except initial connection...");

		for (i = 0; i < 125; i++)
		if (c[i] != null)
		try {
			c[i].close();
			System.out.print(".");
		} catch (SQLException se2) {
			se2.printStackTrace();
			System.out.println("Error code is: " + se2.getErrorCode());
			System.out.println("SQLState is: " + se2.getSQLState());
		}
		System.out.println("Done!");

	}

}