2009-12-19 29 views
38

Estoy aprendiendo acerca de las maravillas de JdbcTemplate y NamedParameterJdbcTemplate. Me gusta lo que veo, pero ¿hay alguna manera fácil de ver el SQL subyacente que termina ejecutando? Me gustaría ver esto con fines de depuración (para, por ejemplo, depurar el SQL resultante en una herramienta externa).Ver el SQL subyacente en Spring JdbcTemplate?

+0

Para aclarar, me gustaría ver el SQL con el '?' dentro para asegurarse de que todo el proceso funcionó correctamente. – Artem

+0

Hola Artem, ¿Lo lograste en tu código? –

Respuesta

37

la Spring documentation dice que están conectados al nivel de depuración:

Todos SQL emitido por esta clase se registra en el nivel dede depuración en la categoría correspondiente al nombre de clase totalmente calificado de la instancia de plantilla (generalmente JdbcTemplate, pero puede ser diferente si está utilizando una subclase personalizada de la clase JdbcTemplate).

En términos XML, es necesario configurar el registrador algo como:

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

este tema fue sin embargo discuten aquí hace un mes y no parece tan fácil para llegar al trabajo como en Hibernate y/o no devolvió la información esperada: Spring JDBC is not logging SQL with log4j Este tema debajo de cada sugiere utilizar P6Spy que también se puede integrar en Spring según this article.

+0

Use como nombre "org.springframework.jdbc", para ver también las consultas SQL reales. – Verhagen

1

No estoy 100% seguro de lo que está obteniendo, ya que generalmente pasará sus consultas SQL (parametrizadas o no) a JdbcTemplate, en cuyo caso solo las registraría. Si tiene PreparedStatement sy no sabe cuál se está ejecutando, el método toString debería funcionar bien. Pero mientras estamos en el tema, hay un buen paquete de registrador Jdbc here que le permitirá registrar automáticamente sus consultas, así como ver los parámetros vinculados cada vez. Muy útil. La salida se ve algo como esto:

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

Que el 'PreparedStatement # toString()' devolvería la cadena de SQL no se especifica en ninguna parte en la API de JDBC y, por lo tanto, es un detalle de implementación. Depende de la marca y/o versión del controlador JDBC, ya sea que funcione o no. – BalusC

+0

El enlace al que se hace referencia en su comentario a http://rkbloom.net/logdriver/ parece estar muerto ahora. ¿Puede proporcionar más detalles sobre este registrador? No puedo encontrar ninguna referencia en el sitio principal. Gracias – Bob

27

Esto funciona para mí con org.springframework.jdbc-3.0.6.RELEASE.jar. No pude encontrar esto en ningún lugar de los documentos de Spring (tal vez soy perezoso) pero encontré (prueba y error) que el nivel TRACE hizo la magia.

estoy usando log4j-1.2.15, junto con slf4j (1.6.4) y presentar propiedades para configurar el log4j:

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

Esto muestra tanto la instrucción SQL y parámetros vinculados de esta manera:

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 

no estoy seguro sobre el tipo de SQL desconocido, pero supongo que podemos ignorarlo aquí

Durante un SQL (es decir, si usted no está interesado en los valores de los parámetros ligados) DEBUG debería ser suficiente.

+0

¡Esto no funciona para mí! –

+1

Creo que esto puede funcionar con jdbc, pero no con jdbctemplate. No funciona para mí también – Emilio

+0

Para mí esto está funcionando con Spring 4.2.4 y 'JdbcTemplate' – Marged

5

Los valores de los parámetros parecen imprimirse en el nivel TRACE.Esto funcionó para mí:

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

Consola:

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

No funciona con jdbcTemplate y logback – Emilio

0

Esto funcionó para mí con log4j2 y xml parámetros:

<?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> 

consola de resultados y del archivo de registro era:

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 

Just copy/past

HTH

Cuestiones relacionadas