Dies ist eine kleine Java-Bibliothek, mit deren Hilfe man SQL-Statements von JDBC-Datenbankverbindungen ausgeben kann.
Normalerweise ist keine Ausgabefunktion in den handelsüblichen Treibern vorhanden. Diese Bibliothek behebt dieses Manko, indem sie die originale Datenbankverbindung umschliesst und alle abgesetzten Statements ausgibt.
Am nützlichsten ist dies für Statements, die über
PreparedStatement-Objekte abgesetzt
werden. Bei diesen gibt es keinen eindeutigen
"SQL-String", da alle durch Fragezeichen ('?')
angegebenen Parameter dynamisch durch Java-Objekte
ersetzt werden. Diese Bibliothek stellt auch für
diese Statements brauchbare Strings für die Ausgabe
bereit.
Es wird ein Java Runtime Environment mit mind. Version 1.5 aka. 5.0 benötigt. Dieses kann z.B. von http://www.java.com/de/ heruntergeladen und installiert werden.
Entpacken Sie die Bibliotek jsqllogger.jar in ein beliebiges Verzeichnis und fügen Sie sie zum Classpath der Anwendung hinzu. Beispiel:
java.exe -cp "jsqllogger.jar" -jar <Anwendungs-Jar-Datei>
Die Biblothek muss so eingebunden werden, dass sie
das originale Connection-Objekt, welches vom
DriverManager erzeugt wird,
umschliesst.
Hier ein Beispiel für die Anbindung einer HSQL-Datenbank
import java.sql.*;
import de.volkeralthaus.jsqllogger.*;
import de.volkeralthaus.jsqllogger.logger.*;
...
LogConnection conn = null;
try {
Properties p = new Properties();
p.put("user", "sa");
p.put("password", "");
Class.forName("org.hsqldb.jdbcDriver").newInstance();
java.sql.Connection realConnection = java.sql.DriverManager.getConnection("jdbc:hsqldb:file:testdb", p);
conn = new de.volkeralthaus.jsqllogger.LogConnection(realConnection);
conn.addLogger(LoggerStatementLogger.getDefaultLogger());
conn.setLogtime(true);
} catch (Exception e) {
throw new Exception("Error on connecting to database", e);
}
...
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO test (id,name,ts) VALUES (?,?,?);");
pstmt.setInt(1, 10,);
pstmt.setString(2, "foo");
pstmt.setTimestamp(3, new java.sql.Timestamp(System.currentTimeMillis()));
pstmt.executeUpdate();
...
Ergibt folgende Ausgabe:
> 25.02.2006 16:47:33 de.volkeralthaus.jsqllogger.logger.LoggerStatementLogger logStatement > INFO: INSERT INTO test (id,name,ts) VALUES (1,'foo','2006-02-25 16:47:33.696000000') > 25.02.2006 16:47:34 de.volkeralthaus.jsqllogger.logger.LoggerStatementLogger logTime > INFO: Execution time: 00:00.016 (16 ms)
Jedes Objekt, welches das
de.volkeralthaus.jsqllogger.logger.StatementLogger-Interface
implementiert, kann zur Ausgabe der SQLs benutzt
werden.
Zwei Logger werden bereits mitgeliefert:
LoggerStatementLogger zur Ausgabe
auf
java.util.logging.Logger-Objekten.
Alle Nachrichten werden auf dem Level INFO
ausgegeben.
OutputStreamStatementLogger zum
Schreiben auf beliebigen OutputStreams, z.B.
System.out. Die Klassenmethode
OutputStreamStatementLogger#getDefaultLogger()
gibt einen vorkonfigurierten Logger auf
System.out zurück.
PreparedStatement#setAsciiStream(int,
java.io.InputStream, int) Dies geht bisher
nicht, da ein normaler InputStream nur ein einziges
Mal lesbar ist.
:wq!