2009-12-19 15 views
38

Sto imparando le meraviglie di JdbcTemplate e NamedParameterJdbcTemplate. Mi piace quello che vedo, ma c'è un modo semplice per vedere l'SQL sottostante che finisce per essere eseguito? Mi piacerebbe vederlo a scopo di debug (per esempio per eseguire il debug dell'SQL risultante in uno strumento esterno).Vedere l'SQL sottostante in Spring JdbcTemplate?

+0

Per chiarire, mi piacerebbe vedere l'SQL con il '?' all'interno per assicurarsi che l'intero processo abbia funzionato correttamente. – Artem

+0

Ciao Artem, hai ottenuto questo nel tuo codice? –

risposta

37

Il Spring documentation dice che è registrato a livello DEBUG:

Tutto SQL emessi da questa classe viene registrato a livello diDEBUG sotto la categoria corrispondente al nome classe completo dell'istanza del modello (in genere JdbcTemplate, ma potrebbe essere diverso se si utilizza una sottoclasse personalizzata della classe JdbcTemplate).

In termini XML, è necessario configurare il logger qualcosa come:

<category name="org.springframework.jdbc.core.JdbcTemplate"> 
    <priority value="debug" /> 
</category> 

Questo argomento è stato tuttavia discusso qui un mese fa e non sembra così facile per andare al lavoro come in Hibernate e/o non ha restituito le informazioni previste: Spring JDBC is not logging SQL with log4j Questo argomento in ciascuna suggerisce di utilizzare P6Spy che può anche essere integrato in primavera in base a this article.

+0

Utilizzare come nome "org.springframework.jdbc", per vedere anche le query SQL reali. – Verhagen

1

Non sono sicuro al 100% di ciò che si sta ricevendo poiché di solito si passano le query SQL (parametrizzate o meno) al JdbcTemplate, nel qual caso si registreranno solo quelle. Se hai PreparedStatement s e non sai quale viene eseguito, il metodo toString dovrebbe funzionare correttamente. Ma mentre siamo in argomento, c'è un bel pacchetto di logger Jdbc here che ti permetterà di registrare automaticamente le tue query e di vedere ogni volta i parametri associati. Molto utile. L'output simile a questa:

executing PreparedStatement: 'insert into ECAL_USER_APPT 
(appt_id, user_id, accepted, scheduler, id) values (?, ?, ?, ?, null)' 
    with bind parameters: {1=25, 2=49, 3=1, 4=1} 
+1

Il fatto che 'PreparedStatement # toString()' restituisca la stringa SQL non è specificato da nessuna parte nell'API JDBC ed è quindi un dettaglio di implementazione. Sei dipendente dalla marca e/o dalla versione del driver JDBC, indipendentemente dal fatto che funzioni o meno. – BalusC

+0

Il link referenziato nel tuo commento a http://rkbloom.net/logdriver/ sembra morto ora. puoi fornire ulteriori dettagli su questo logger? Non riesco a trovare alcun riferimento ad esso sul sito principale. Grazie – Bob

27

Questo funziona per me con org.springframework.jdbc-3.0.6.RELEASE.jar. Non riuscivo a trovarlo da nessuna parte nei documenti Spring (forse sono solo pigro) ma ho trovato (tentativi ed errori) che il livello TRACE ha fatto la magia.

sto usando log4j-1.2.15 con slf4j (1.6.4) e le proprietà del file per configurare il log4j:

log4j.logger.org.springframework.jdbc.core = TRACE 

Questo visualizza sia l'istruzione SQL ei parametri legati in questo modo:

Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME] 
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown 
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown 
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown 

non sono sicuro sul tipo SQL sconosciuta ma credo che possiamo ignorare qui

solo per uno SQL (cioè se non siete interessati a valori dei parametri legati) DEBUG dovrebbe essere sufficiente.

+0

Questo non funziona per me !! –

+1

Penso che questo possa funzionare con jdbc, ma senza jdbctemplate. Non funziona anche per me – Emilio

+0

Per me questo funziona con Spring 4.2.4 e 'JdbcTemplate' – Marged

5

I valori dei parametri sembrano essere stampati a livello TRACE.Questo ha funzionato per me:

uscita
log4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file 
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file 

Console:

02:40:56,519 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 1, parameter value [Tue May 31 14:00:00 CEST 2005], value class [java.util.Date], SQL type unknown 
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 2, parameter value [61], value class [java.lang.Integer], SQL type unknown 
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 3, parameter value [80], value class [java.lang.Integer], SQL type unknown 
+1

Non funziona con jdbcTemplate e logback – Emilio

0

Questo ha funzionato per me con log4j2 e XML parametri:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="debug"> 
    <Properties> 
     <Property name="log-path">/some_path/logs/</Property> 
     <Property name="app-id">my_app</Property> 
    </Properties> 

    <Appenders> 
     <RollingFile name="file-log" fileName="${log-path}/${app-id}.log" 
      filePattern="${log-path}/${app-id}-%d{yyyy-MM-dd}.log"> 
      <PatternLayout> 
       <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n 
       </pattern> 
      </PatternLayout> 
      <Policies> 
       <TimeBasedTriggeringPolicy interval="1" 
        modulate="true" /> 
      </Policies> 
     </RollingFile> 

     <Console name="console" target="SYSTEM_OUT"> 
      <PatternLayout 
       pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 

     <Logger name="org.springframework.jdbc.core" level="trace" additivity="false"> 
      <appender-ref ref="file-log" /> 
      <appender-ref ref="console" /> 
     </Logger> 

     <Root level="info" additivity="false"> 
      <appender-ref ref="file-log" /> 
      <appender-ref ref="console" /> 
     </Root> 
    </Loggers> 

</Configuration> 

console Risultato e log file è stato:

JdbcTemplate - Executing prepared SQL query 
JdbcTemplate - Executing prepared SQL statement [select a, b from c where id = ? ] 
StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [my_id], value class [java.lang.String], SQL type unknown 

Basta copiare/passato

HTH

Problemi correlati