Java program to load event monitor output into tables
A small java program (original source is here) that will load the event monitor output into a database table to make it easier to analyze results. The program has a few small changes to handle DB2 version 8 and 9 and also to capture an identifier for the RUN for which events have been captured. That way, it will be possible to store multiple event monitor runs into the same table and compare.
Sorry for the formatting of source code, haven't figured out how to copy with tabs into this blogger window yet.
import java.io.*;
import java.sql.*;
/**
* DB2Trace program reads the output from the db2event monitor
* and inserts the data into a database.
*
* Creation Date: January 15 2003.
*/
class DB2Trace {
/**
* Usage: java DB2Trace sqltrace.txt jdbc:db2:db2mwh userid
* password
* sqltrace.txt is the input file
* jdbc:db2:db2mwh is the database jdbc url connection
* username is the user ID
* password is the password
* @param args[]
* @exception IOException, SQLException
*/
public static void main (String args[]) throws IOException,
SQLException {
FileWriter fw = new FileWriter("DB2Trace.sql");
PrintWriter pw = new PrintWriter(fw);
BufferedReader in = new BufferedReader(new FileReader(args[0]));
String s = "";
String sqlString = "";
boolean textYes = false;
int exists = 0;
COM.ibm.db2.jdbc.app.DB2Driver driver = new COM.ibm.db2.jdbc.app.DB2Driver();
java.sql.DriverManager.registerDriver(driver);
Connection conn = java.sql.DriverManager.getConnection(args[1], args[2], args[3]);
conn.setAutoCommit(false);
System.out.println("Connected");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("SELECT COUNT(*) FROM SYSCAT.TABLES WHERE TABSCHEMA=USER AND " + "TABNAME='DB2TRACE'");
while (rset.next()) {
exists = rset.getInt(1);
}
if (exists > 0)
stmt.executeUpdate("DROP TABLE DB2TRACE");
stmt.executeUpdate("CREATE TABLE DB2TRACE( RUNID VARCHAR(30), OPERATION VARCHAR(30),SQLTXT VARCHAR(32000),"
+ "STARTTIME VARCHAR(30),STOPTIME VARCHAR(30) ,"
+ "EXECTIME VARCHAR(20),"
+ "USRCPU VARCHAR(20)," + "SORTS VARCHAR(20)," + "TOTSORTTIME VARCHAR(20), PKGNAME VARCHAR(20), SECTNO INTEGER,PKGSCHEMA VARCHAR(30)) IN TRACE_TSP ");
stmt.executeUpdate("CREATE INDEX DB2TRACE_CPU ON DB2TRACE(USRCPU)");
PreparedStatement p = conn.prepareStatement("INSERT INTO DB2TRACE(OPERATION,SQLTXT,EXECTIME,"+"STARTTIME,STOPTIME,USRCPU,SORTS,TOTSORTTIME,PKGNAME,SECTNO,PKGSCHEMA,RUNID) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)");
int i = 0;
while ((s = in.readLine()) != null) {
if (i%100000 == 0) {
System.out.println("Loop "+i);
conn.commit();
}
i++;
if (s.startsWith(" Operation: ")) {
p.setString(1, s.substring(13, s.length()));
}
if (s.startsWith(" Text :")) {
textYes = true;
p.setString(2, s.substring(13, s.length()));
}
if (s.startsWith(" Type : Static")) {
textYes = true;
p.setString(2, "STATIC_SQL");
}
if (s.startsWith(" Exec Time:")) {
p.setString(3, s.substring(14, s.length() - 7));
}
if (s.startsWith(" Start Time: ")) {
p.setString(4, s.substring(14, s.length()));
}
if (s.startsWith(" Stop Time: ")) {
p.setString(5, s.substring(14, s.length()));
}
if (s.startsWith(" User CPU:")) {
p.setString(6, s.substring(13, s.length() - 7));
}
if (s.startsWith(" Sorts:")) {
p.setString(7, s.substring(8, s.length()));
}
if (s.startsWith(" Package :")) {
p.setString(9, s.substring(13, s.length()));
}
if (s.startsWith(" Section :")) {
p.setString(10, s.substring(12, s.length()));
}
if (s.startsWith(" Creator :")) {
p.setString(11, s.substring(13, s.length()));
}
p.setString(12, args[0]);
if (s.startsWith(" Total sort time:")) {
p.setString(8, s.substring(18, s.length()));
if (textYes == true) {
p.executeUpdate();
textYes = false;
}
}
}
pw.close();
conn.commit();
System.out.println("Updating...");
// Fill up the sql text of static sql
stmt.executeUpdate("UPDATE DB2TRACE A SET A.SQLTXT = (SELECT B.TEXT FROM STATEMENTS B WHERE B.PKGNAME=A.PKGNAME AND B.SECTNO=A.SECTNO AND B.PKGSCHEMA = A.PKGSCHEMA) WHERE A.SQLTXT='STATIC_SQL' AND A.RUNID ='"+args[0]+"'");
conn.commit();
stmt.close();
p.close();
}
}
Sorry for the formatting of source code, haven't figured out how to copy with tabs into this blogger window yet.
import java.io.*;
import java.sql.*;
/**
* DB2Trace program reads the output from the db2event monitor
* and inserts the data into a database.
*
* Creation Date: January 15 2003.
*/
class DB2Trace {
/**
* Usage: java DB2Trace sqltrace.txt jdbc:db2:db2mwh userid
* password
* sqltrace.txt is the input file
* jdbc:db2:db2mwh is the database jdbc url connection
* username is the user ID
* password is the password
* @param args[]
* @exception IOException, SQLException
*/
public static void main (String args[]) throws IOException,
SQLException {
FileWriter fw = new FileWriter("DB2Trace.sql");
PrintWriter pw = new PrintWriter(fw);
BufferedReader in = new BufferedReader(new FileReader(args[0]));
String s = "";
String sqlString = "";
boolean textYes = false;
int exists = 0;
COM.ibm.db2.jdbc.app.DB2Driver driver = new COM.ibm.db2.jdbc.app.DB2Driver();
java.sql.DriverManager.registerDriver(driver);
Connection conn = java.sql.DriverManager.getConnection(args[1], args[2], args[3]);
conn.setAutoCommit(false);
System.out.println("Connected");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("SELECT COUNT(*) FROM SYSCAT.TABLES WHERE TABSCHEMA=USER AND " + "TABNAME='DB2TRACE'");
while (rset.next()) {
exists = rset.getInt(1);
}
if (exists > 0)
stmt.executeUpdate("DROP TABLE DB2TRACE");
stmt.executeUpdate("CREATE TABLE DB2TRACE( RUNID VARCHAR(30), OPERATION VARCHAR(30),SQLTXT VARCHAR(32000),"
+ "STARTTIME VARCHAR(30),STOPTIME VARCHAR(30) ,"
+ "EXECTIME VARCHAR(20),"
+ "USRCPU VARCHAR(20)," + "SORTS VARCHAR(20)," + "TOTSORTTIME VARCHAR(20), PKGNAME VARCHAR(20), SECTNO INTEGER,PKGSCHEMA VARCHAR(30)) IN TRACE_TSP ");
stmt.executeUpdate("CREATE INDEX DB2TRACE_CPU ON DB2TRACE(USRCPU)");
PreparedStatement p = conn.prepareStatement("INSERT INTO DB2TRACE(OPERATION,SQLTXT,EXECTIME,"+"STARTTIME,STOPTIME,USRCPU,SORTS,TOTSORTTIME,PKGNAME,SECTNO,PKGSCHEMA,RUNID) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)");
int i = 0;
while ((s = in.readLine()) != null) {
if (i%100000 == 0) {
System.out.println("Loop "+i);
conn.commit();
}
i++;
if (s.startsWith(" Operation: ")) {
p.setString(1, s.substring(13, s.length()));
}
if (s.startsWith(" Text :")) {
textYes = true;
p.setString(2, s.substring(13, s.length()));
}
if (s.startsWith(" Type : Static")) {
textYes = true;
p.setString(2, "STATIC_SQL");
}
if (s.startsWith(" Exec Time:")) {
p.setString(3, s.substring(14, s.length() - 7));
}
if (s.startsWith(" Start Time: ")) {
p.setString(4, s.substring(14, s.length()));
}
if (s.startsWith(" Stop Time: ")) {
p.setString(5, s.substring(14, s.length()));
}
if (s.startsWith(" User CPU:")) {
p.setString(6, s.substring(13, s.length() - 7));
}
if (s.startsWith(" Sorts:")) {
p.setString(7, s.substring(8, s.length()));
}
if (s.startsWith(" Package :")) {
p.setString(9, s.substring(13, s.length()));
}
if (s.startsWith(" Section :")) {
p.setString(10, s.substring(12, s.length()));
}
if (s.startsWith(" Creator :")) {
p.setString(11, s.substring(13, s.length()));
}
p.setString(12, args[0]);
if (s.startsWith(" Total sort time:")) {
p.setString(8, s.substring(18, s.length()));
if (textYes == true) {
p.executeUpdate();
textYes = false;
}
}
}
pw.close();
conn.commit();
System.out.println("Updating...");
// Fill up the sql text of static sql
stmt.executeUpdate("UPDATE DB2TRACE A SET A.SQLTXT = (SELECT B.TEXT FROM STATEMENTS B WHERE B.PKGNAME=A.PKGNAME AND B.SECTNO=A.SECTNO AND B.PKGSCHEMA = A.PKGSCHEMA) WHERE A.SQLTXT='STATIC_SQL' AND A.RUNID ='"+args[0]+"'");
conn.commit();
stmt.close();
p.close();
}
}
