/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.samples; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import org.h2.api.DatabaseEventListener; import org.h2.jdbc.JdbcConnection; /** * This example application implements a database event listener. * This is useful to display progress information while opening a large database, * or to log database exceptions. */ public class ShowProgress implements DatabaseEventListener { private long last, start; /** * Create a new instance of this class, and start the timer. */ public ShowProgress() { start = last = System.currentTimeMillis(); } /** * This method is called when executing this sample application from the * command line. * * @param args the command line parameters */ public static void main(String... args) throws Exception { new ShowProgress().test(); } /** * Run the progress test. */ void test() throws Exception { Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:test", "sa", ""); Statement stat = conn.createStatement(); stat.execute("DROP TABLE IF EXISTS TEST"); stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR)"); PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, 'Test' || SPACE(100))"); long time; time = System.currentTimeMillis(); int len = 1000; for (int i = 0; i < len; i++) { long now = System.currentTimeMillis(); if (now > time + 1000) { time = now; System.out.println("Inserting " + (100L * i / len) + "%"); } prep.setInt(1, i); prep.execute(); } boolean abnormalTermination = true; if (abnormalTermination) { ((JdbcConnection) conn).setPowerOffCount(1); try { stat.execute("INSERT INTO TEST VALUES(-1, 'Test' || SPACE(100))"); } catch (SQLException e) { // ignore } } else { conn.close(); } System.out.println("Open connection..."); time = System.currentTimeMillis(); conn = DriverManager.getConnection("jdbc:h2:test;DATABASE_EVENT_LISTENER='" + getClass().getName() + "'", "sa", ""); time = System.currentTimeMillis() - time; System.out.println("Done after " + time + " ms"); prep.close(); stat.close(); conn.close(); } /** * This method is called if an exception occurs in the database. * * @param e the exception * @param sql the SQL statement */ public void exceptionThrown(SQLException e, String sql) { System.out.println("Error executing " + sql); e.printStackTrace(); } /** * This method is called when opening the database to notify about the progress. * * @param state the current state * @param name the object name (depends on the state) * @param current the current progress * @param max the 100% mark */ public void setProgress(int state, String name, int current, int max) { long time = System.currentTimeMillis(); if (time < last + 5000) { return; } last = time; String stateName = "?"; switch (state) { case STATE_SCAN_FILE: stateName = "Scan " + name; break; case STATE_CREATE_INDEX: stateName = "Create Index " + name; break; case STATE_RECOVER: stateName = "Recover"; break; default: return; } try { Thread.sleep(1); } catch (InterruptedException e) { // ignore } System.out.println("State: " + stateName + " " + (100 * current / max) + "% (" + current + " of " + max + ") " + (time - start) + " ms"); } /** * This method is called when the database is closed. */ public void closingDatabase() { System.out.println("Closing the database"); } /** * This method is called just after creating the instance. * * @param url the database URL */ public void init(String url) { System.out.println("Initializing the event listener for database " + url); } /** * This method is called when the database is open. */ public void opened() { // do nothing } }