Spring JdbcTemplate に基礎となる SQL が表示されていますか?
-
20-09-2019 - |
質問
JdbcTemplate と NamedParameterJdbcTemplate の素晴らしさを学んでいます。表示される内容は気に入っていますが、最終的に実行される基礎となる SQL を確認する簡単な方法はありますか?これをデバッグ目的で確認したいと思います(たとえば、結果として得られる SQL を外部ツールでデバッグするため)。
解決
の 春のドキュメント DEBUG レベルでログに記録されていると言います。
このクラスによって発行されたすべての SQL は、次の場所に記録されます。 デバッグ 下のレベル カテゴリー 完全修飾に対応する クラス名 テンプレート インスタンス (通常は JdbcTemplate ですが、JdbcTemplate クラスのカスタム サブクラスを使用している場合は異なる場合があります)。
XML 用語では、次のようにロガーを構成する必要があります。
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
ただし、このテーマは 1 か月前にここで議論されましたが、Hibernate ほど簡単に動作しなかったり、期待した情報が返されなかったりするようです。 Spring JDBC が log4j で SQL をログに記録しない それぞれのトピックでは、次の使用を推奨しています。 P6スパイ これはSpringにも統合できます この記事.
他のヒント
このはorg.springframework.jdbc-3.0.6.RELEASE.jarと私のために動作します。 私は春のドキュメントでは、このどこかを見つけることができませんでした(多分私は怠け者)が、私はTRACEレベルが魔法をしたことを(試行錯誤)が見つかります。
私はSLF4J(1.6.4)と一緒にlog4j-1.2.15を使用しているとプロパティは、log4jのを設定するには、ファイルます:
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
が十分でなければなりません。
パラメータ値は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
このは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
私は春のブートアプリケーションのために、このラインを使用します:
logging.level.org.springframework.jdbc.core = TRACE
このアプローチはかなり普遍的と私は通常、自分のアプリケーション内の任意の他のクラスのためにそれを使用します。
私はあなたが通常あなたがちょうどそれらをログに記録します。その場合には、JdbcTemplateにあなたのSQLクエリ(パラメータ化さか)に渡しますので、で取得しているものを100%わかりません。あなたはPreparedStatement
sを持っていて、実行されている1わからない場合は、toString
メソッドが正常に動作する必要があります。しかし、私たちが対象にしている一方で、素敵な対応のJDBCロガーパッケージがありますここをあなたは自動的にログインできますどのクエリは、だけでなく、毎回バインドパラメータを参照してください。非常に便利。出力は次のようになります。
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}
タグの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