Frage

Ich lerne etwas über die Wunder von JdbcTemplate und NamedParameterJdbcTemplate.Mir gefällt, was ich sehe, aber gibt es eine einfache Möglichkeit, das zugrunde liegende SQL zu sehen, das letztendlich ausgeführt wird?Ich würde dies gerne zu Debugzwecken sehen (um beispielsweise das resultierende SQL in einem externen Tool zu debuggen).

War es hilfreich?

Lösung

Die Frühling Dokumentation , sagt sie auf DEBUG Ebene angemeldet sind:

  

Alle SQL von dieser Klasse ausgegeben wird, an dem debug Ebene unter der entsprechend den vollständig qualifizierten Klassennamen protokollierte die Vorlageninstanz (typischerweise JdbcTemplate, aber es kann anders sein, wenn Sie eine benutzerdefinierte Unterklasse der JdbcTemplate Klasse verwenden).

In XML Begriffe, müssen Sie den Logger etwas konfigurieren, wie:

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

Dieses Thema wurde jedoch diskutiert vor einem Monat, und es scheint nicht so einfach zu Arbeit zu erhalten, wie in dem Ruhezustand und / oder es hat die erwartete Information nicht zurück: Frühling JDBC ist nicht SQL mit log4j diesem Thema Anmeldung unter jedem Gebrauch schlägt p6spy die auch im Frühjahr nach dieser Artikel .

Andere Tipps

Dies funktioniert für mich mit org.springframework.jdbc-3.0.6.RELEASE.jar. Ich konnte nicht diese überall in den Frühling docs finden (vielleicht bin ich einfach nur faul), aber ich fand (Versuch und Irrtum), dass die TRACE Ebene die Magie tat.

Ich bin mit log4j-1.2.15 zusammen mit slf4j (1.6.4) und Eigenschaftendatei der log4j zu konfigurieren:

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

Dies zeigt sowohl die SQL-Anweisung und gebundene Parameter wie folgt aus:

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

Nicht sicher über die SQL-Typ unbekannt, aber ich denke, wir es hier ignorieren

Für nur eine SQL (das heißt, wenn Sie in gebundenen Parameterwerte nicht interessiert) DEBUG sollte genug sein.

scheinen Parameterwerte auf TRACE Ebene gedruckt werden. Dieser arbeitete für mich:

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

Konsolenausgabe:

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

Das ist für mich mit log4j2 und XML-Parametern gearbeitet:

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

Ergebnis Konsole und Dateiprotokoll war:

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

Kopieren Sie einfach / Vergangenheit

HTH

Ich benutze diese Linie für Frühjahr Boot-Anwendungen:

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

Dieser Ansatz ziemlich universell und ich es in der Regel für alle anderen Klassen in meiner Anwendung verwenden.

Ich bin mir nicht hundertprozentig sicher, was Sie meinen, da Sie Ihre SQL-Abfragen (parametrisiert oder nicht) normalerweise an die JdbcTemplate übergeben und diese dann einfach protokollieren.Wenn Sie haben PreparedStatements und Sie wissen nicht, welches ausgeführt wird, das toString Methode sollte gut funktionieren.Aber wenn wir schon beim Thema sind: Es gibt ein nettes JDBC-Logger-Paket Hier Dadurch können Sie Ihre Abfragen automatisch protokollieren und jedes Mal die gebundenen Parameter anzeigen.Sehr hilfreich.Die Ausgabe sieht in etwa so aus:

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} 

Versuchen Sie in das Hinzufügen 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>

Ihre Protokolle sieht aus wie:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top