Domanda

sto imparando circa le meraviglie della JdbcTemplate e NamedParameterJdbcTemplate. Mi piace quello che vedo, ma c'è un modo semplice per vedere lo SQL sottostante che finisce per l'esecuzione? Mi piacerebbe vedere questo a scopo di debug (per esempio, per eseguire il debug del SQL risultante in uno strumento al di fuori).

È stato utile?

Soluzione

Il documentazione Primavera dice che è registrato a livello DEBUG:

  

All SQL emessi da questa classe viene registrato presso il DEBUG il livello sotto il Categoria che corrisponde al nome completo della classe di l'istanza di 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 che non ha restituito le informazioni previste: Spring JDBC non sta registrando SQL con log4j Questo argomento sotto ogni suggerisce di utilizzare P6Spy che può anche essere integrato in primavera secondo questo articolo .

Altri suggerimenti

Questo funziona per me con org.springframework.jdbc-3.0.6.RELEASE.jar. Non riuscivo a trovare questo ovunque nella documentazione di primavera (forse sono solo pigro), ma ho trovato (tentativi ed errori), che il livello di traccia 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

Questa mostra 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 che qui

Per una semplice SQL (vale a dire se non siete interessati a valori dei parametri legati) DEBUG dovrebbe essere sufficiente.

I valori dei parametri sembrano essere stampato sul livello di traccia. Questo ha funzionato per me:

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

uscita della 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

Questo ha funzionato per me con i parametri 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>

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

Io uso questa linea per le applicazioni di avvio Primavera:

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

Questo approccio piuttosto universale e io di solito uso per eventuali altre classi all'interno della mia applicazione.

Sono sicuro al 100% quello che stai ricevendo in dato che di solito si passa nelle query SQL (con parametri o meno) alla JdbcTemplate, nel qual caso si sarebbe solo log quelli. Se si dispone di PreparedStatements e non si sa quale è in esecuzione, il metodo toString dovrebbe funzionare bene. Ma già che siamo in tema, c'è un bel pacchetto logger JDBC qui che vi permetterà di accedere automaticamente la vostra query così come vedere i parametri legati ogni volta. 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} 

Prova ad aggiungere in 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>

vostri log appare come:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top