Pergunta

Estou aprendendo sobre as maravilhas do JDBCTEMPLATE e NOTHPARAMETERJDBCTEMPLATE. Eu gosto do que vejo, mas há alguma maneira fácil de ver o SQL subjacente que acaba executando? Eu gostaria de ver isso para fins de depuração (para, por exemplo, depurar o SQL resultante em uma ferramenta externa).

Foi útil?

Solução

o Documentação da primavera diz que eles estão registrados no nível de depuração:

Todos os SQL emitidos por esta classe são registrados no DEPURAR nível sob o categoria correspondente ao totalmente qualificado nome da classe da instância do modelo (normalmente JDBCTemplate, mas pode ser diferente se você estiver usando uma subclasse personalizada da classe JDBCTemplate).

Em termos XML, você precisa configurar o registrador algo como:

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

No entanto, esse assunto foi discutido aqui há um mês e não parece tão fácil começar a trabalhar como em Hibernate e/ou não retornou as informações esperadas: Spring JDBC não está registrando SQL com log4j Este tópico sob cada um sugere usar P6spy que também pode ser integrado na primavera de acordo Este artigo.

Outras dicas

Isso funciona para mim com org.springframework.jdbc-3.0.6.release.jar. Não consegui encontrar isso em nenhum lugar dos documentos da primavera (talvez eu seja apenas preguiçoso), mas encontrei (julgamento e erro) que o nível de rastreamento fez a mágica.

Estou usando o arquivo log4j-1.2.15 junto com o arquivo SLF4J (1.6.4) e Propriedades para configurar o log4j:

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

Isso exibe a instrução SQL e os parâmetros vinculados como este:

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

Não tenho certeza sobre o tipo SQL desconhecido, mas acho que podemos ignorá -lo aqui

Para apenas um SQL (ou seja, se você não estiver interessado em valores de parâmetros vinculados) DEBUG deve ser suficiente.

Os valores dos parâmetros parecem ser impressos no nível do rastreamento. Isso funcionou para mim:

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

Saída do 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

Isso funcionou para mim com os parâmetros log4j2 e xml:

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

O console de resultados e o log de arquivos foram:

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 copiar/passado

Hth

Eu uso esta linha para aplicativos de inicialização de primavera:

logging.level.org.springframework.jdbc.core = TRACE

Essa abordagem é bastante universal e eu geralmente a uso para outras classes dentro do meu aplicativo.

Não tenho 100% de certeza do que você está conseguindo, pois geralmente você passa em suas consultas SQL (parametrizadas ou não) para o JDBCTemplate; nesse caso, você apenas as registraria. Se você tem PreparedStatements e você não sabe qual está sendo executado, o toString O método deve funcionar bem. Mas enquanto estamos no assunto, há um bom pacote de logger JDBC aqui O que permitirá registrar automaticamente suas consultas e ver os parâmetros vinculados a cada vez. Muito útil. A saída se parece com o seguinte:

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} 

Tente adicionar log4j.xml

<!--  enable query logging -->
<category name="org.springframework.jdbc.core.JdbcTemplate">
    <priority value="DEBUG" />
</category>

<!-- enable query logging for SQL statement parameter value -->
<category name="org.springframework.jdbc.core.StatementCreatorUtils">
    <priority value="TRACE" />
</category>

Seus troncos se parecem:

DEBUG JdbcTemplate:682 - Executing prepared SQL query
DEBUG JdbcTemplate:616 - Executing prepared SQL statement [your sql query]
TRACE StatementCreatorUtils:228 - Setting SQL statement parameter value: column index 1, parameter value [param], value class [java.lang.String], SQL type unknown
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top