web-dev-qa-db-ja.com

Spring JdbcTemplateで基礎となるSQLを見ていますか?

私はJdbcTemplateとNamedParameterJdbcTemplateの驚異について学んでいます。私は見ているものが好きですが、それが実行されてしまう根本的なSQLを見る簡単な方法はありますか?デバッグ目的でこれを確認したい(たとえば、結果のSQLを外部ツールでデバッグするため)。

54
Artem

Spring documentation は、それらがDEBUGレベルでログに記録されると言っています:

このクラスによって発行されたすべてのSQLは[〜#〜] debug [〜#〜]レベルでcategoryテンプレートインスタンスの完全修飾クラス名に対応(通常はJdbcTemplateですが、 JdbcTemplateクラスのカスタムサブクラスを使用している場合は異なる場合があります)。

XMLの用語では、次のようなロガーを構成する必要があります。

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

ただし、この件については1か月前にここで説明しましたが、Hibernateほど作業を開始するのが簡単ではないか、期待される情報が返されませんでした。 SpringJDBCはlog4j 各トピックの下のこのトピックでは、 この記事 に従って、 P6Spy をSpringに統合することもできます。

47
BalusC

これはorg.springframework.jdbc-3.0.6.RELEASE.jarで機能します。私はSpringドキュメントのどこにもこれを見つけることができませんでした(たぶん私は怠け者かもしれません)が、TRACEレベルが魔法をかけたことがわかりました(試行錯誤)。

Log4jを構成するために、slf4j(1.6.4)およびプロパティファイルとともにlog4j-1.2.15を使用しています。

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

これにより、SQLステートメントと次のようなバインドされたパラメーターの両方が表示されます。

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

不明なSQLタイプについては不明ですが、ここでは無視できます。

単にSQLの場合(つまり、バインドされたパラメーター値に関心がない場合)DEBUGで十分です。

33
Kroky

パラメータ値はTRACEレベルで出力されるようです。これは私のために働いた:

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

コンソール出力:

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

私はこの行をSpring Bootアプリケーションに使用します:

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

このアプローチは非常に普遍的であり、通常はアプリケーション内の他のクラスに使用します。

2

これはlog4j2と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>

結果コンソールとファイルログは次のとおりでした。

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

コピー/ペーストするだけ

HTH

2
JRichardsz

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>

ログは次のようになります。

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
0
ravi

通常、SQLクエリ(パラメーター化されているかどうかに関係なく)をJdbcTemplateに渡します。その場合は、それらをログに記録するだけなので、何を取得しているかは100%わかりません。 PreparedStatementsがあり、どれが実行されているかわからない場合は、toStringメソッドが正常に機能するはずです。ただし、この件については、Nice Jdbcロガーパッケージ here があります。このパッケージを使用すると、クエリを自動的に記録し、毎回バインドされたパラメーターを確認できます。非常に便利。出力は次のようになります。

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} 
0
danben