Spring Data JPA開発で実際に発行されているSQLを確認する
ログ出力設定を行うと、このようなSQL発行記録がコンソールやログに出力されるようになります。
プレースホルダ付きのSQL本文(上段)とプレースホルダにセットした値(下段)が確認できます。
2021-09-11 12:26:33.736 DEBUG org.hibernate.SQL : select table0_.id as act_clas1_0_, table0_.name as act_clas2_0_, table0_.aflag as aflag_3_0_ from master master0_ where table0_.aflag=?
2021-09-11 12:26:33.737 TRACE o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BOOLEAN] - [true]
どんな時に使う?
実際に発行されているSQLを見たい
プログラム開発中、SQLを直接コーディングしなくてよいのは便利ではありますが、Java側は正しく問い合わせをしているつもりだけど狙った結果が取れてこない場合など、どんなSQLが実際に発行されているのか確認したい場合があります。
バインドしている値を確認したい
プレースホルダがどれで、実際にどんな値をセットしてSQLを発行したのか確認できます。
システムの性能が出ない時にSQLを確認したい
テーブル構造が複雑になったり、データの件数が数十万、数百万ぐらいになるとSQLの構文によってシステムの応答速度に差が出てきます。
そんな時は、発行しているSQLが狙ったとおりに組み上がっていなかったり、無駄な問い合わせが混ざっていたり、またはインデックスを張っていないカラムなどを条件にしている等確認する必要があり、その時は実際のSQLを確認する必要があります。
やり方
Springbootの開発プロジェクトで、データベースがMySQLでJPAはhibernateの前提でいきます。なにを使っているかは設定ファイルで確認できます。
spring:
(省略)
jpa:
database: MYSQL
hibernate:
ddl-auto: update
ログ出力設定のセクションで、hibernateの出力レベルがERRORになっていますので、エラーが発生した時しかログが出力されません。
本番運用が安定してきたらこの設定でよいのですが、開発中で実際に発行されたSQLを確認したい場合は設定を変更する必要があります。
logging:
level:
root: INFO
org:
springframework.web: INFO
hibernate: ERROR
このように書き換えて再起動します。
logging:
level:
root: INFO
org:
springframework.web: INFO
hibernate:
type:
descriptor:
sql:
BasicBinder: trace
EnumType: trace
SQL: debug
SQLがログに出力されるようになりましたか!?
コメント