Introduzione
In questo breve articolo vediamo come sia possibile tracciare le operazioni che sono eseguite nell’ambito di una connessione JDBC a fini di debugging. Per una guida rapida introduttiva su concetti legati all’utilizzo delle API JDBC per la connessione ad una base dati potete consultare il post Accesso ai Database in Java con JDBC.
Tracciamento con Driver Manager
Un metodo rapido per rilevare le operazioni eseguite in conseguenza delle chiamate JDBC è quello di abilitarne il tracciamento (JDBC tracing). La specifica infatti prevede un meccanismo di tracciamento tale da riportare un dettaglio di tutte le attività che si verificano nel sistema legate alle operazioni JDBC. Le modalità di attivazione dipendono dall’oggetto utilizzato per la gestione della connessione.
Se si utilizza il DriverManager
per stabilire la connessione al database, si può utilizzare il metodo DriverManager.setLogWriter
per attivare l’analisi delle operazioni JDBC su file specifico. Il seguente codice mostra un esempio di utilizzo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class JdbcLog { // Database settings private static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String DB_URL = "jdbc:oracle:thin:@//[HOST]:1521/[DB]"; // Database credentials private static final String USER = "[USER]"; private static final String PASS = "[PASS]"; // Stream di log di JDBC static PrintWriter sqlstream = null; static { try { sqlstream = new PrintWriter(new FileOutputStream("sql.log")); } catch (IOException e) { System.err.println("ERRORE I/O: " + e.getMessage()); } } static public void main(String[] args) { try { // Carica il driver Cloudscape Class.forName(JDBC_DRIVER); DriverManager.setLogWriter(sqlstream); DriverManager.println("Sessione " + (new java.util.Date()).toString() ); // Crea connessione DriverManager.println("apertura connessione..."); Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); DriverManager.println("connessione aperta con successo"); // Chiude la connessione DriverManager.println("chiusura connessione..."); conn.close(); DriverManager.println("connessione chiusa con successo"); } catch (Exception e) { System.err.println("ERRORE: " + e.getMessage()); } } } |
L’esecuzione del codice genera un file sql.log
con il seguente contenuto:
1 2 3 4 5 6 7 8 |
Sessione Fri Oct 28 09:55:56 CEST 2016 — apertura connessione... DriverManager.getConnection("jdbc:oracle:thin:@//[HOST]:1521/[DB]") trying oracle.jdbc.OracleDriver getConnection returning oracle.jdbc.OracleDriver connessione aperta con successo chiusura connessione... connessione chiusa con successo |
Come si nota al testo inserito da noi attraverso il metodo println()
della classe DriverManager
sono presenti informazioni generate dal sistema, come ad esempio la richiesta di connessione ed il recupero del driver oracle.jdbc.OracleDriver
.
Metodi Alternativi
Come detto esistono altri metodi utili per abilitare il tracing delle operazioni JDBC in funzione delle tecniche di gestione delle connessioni:
- Se si utilizza un oggetto
DataSource
per connettersi ad una origine dati il metodo èDataSource.setLogWriter
; - Per connessioni pooled, si utilizza il metodo
ConnectionPoolDataSource.setLogWriter;
- Per connessioni che possono partecipare a transazioni distribuite, si utilizza il metodo
XADataSource.setLogWriter
.