To do quick-'n'-dirty timing:
boolean debug = true; long startTime = System.currentTimeMillis(); if (debug) { out.println("Elapsed: " + ( System.currentTimeMillis() - startTime ) + " milliseconds"); }
To get the full stacktrace in a String (this should've been part of the API):
try { // Do stuff } catch (Exception e) { StringBuffer sb = new StringBuffer(); StackTraceElement st[] = e.getStackTrace(); sb.append(e.getMessage() + "\n"); for (int i = 0; i < st.length; i++) sb.append("at " + st[i].getClassName() + "." + st[i].getMethodName() + "(" + st[i].getFileName()+": " + st[i].getLineNumber() + ")"); }
To put a long-running query in the background, and keep refreshing your JSP until it's done (there are better ways!):
public class TestThread extends Thread { private Connection conn; private boolean debugging = false; private StringBuffer runtime; public TestThread( Connection conn, StringBuffer runtime ) { this.conn = conn; this.runtime = runtime; } public void run() { // Clean 'em (shouldn't be necessary) try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "select sysdate()" ); rs.next(); Date d = rs.getDate(1); long startTime = System.currentTimeMillis(); try { Thread.sleep(1000*20); // Sleep 20 seconds } catch (InterruptedException ie) { // Do nothing } runtime.append(d); } catch (SQLException se) { runtime.append("-1"); } } }
And here's the JSP page that keeps refreshing:
<%@ page language="java" session="true" import="blahblah"%> <html> <head> <title>ThreadTest</title> <% Connection conn = null; // obtain your connection // Set URL String refreshURL = request.getRequestURL().toString(); // See if thread was fired StringBuffer runtime = null; Object obj = session.getAttribute("TestThreadRuntime0"); if( obj == null ) { // Thread hasn't been fired before. Start it. runtime = new StringBuffer(""); session.setAttribute("TestThreadRuntime0", runtime); TestThread tt = new TestThread( conn, runtime ); tt.start(); } else { // Thread has fired before. See whether it's finished. runtime = (StringBuffer) obj; } // See if we're finished boolean done = false; if (runtime.length() > 0) { done = true; } if (!done) { %> <meta http-equiv="Refresh" CONTENT="3; url=<%= refreshURL %>"> <% } %> </head> <body> <% if (!done) { %> Not done yet... <p> <%= obj %> <% } else { // Reset stuff for next run session.setAttribute("TestThreadRuntime0", null); %> We're done!! Runtime: <%= runtime %> <% } %> </body> </html>