この記事にはプロモーションが含まれていることがあります

Spring Data JPA開発で実際に発行されているSQLを確認する

IT
スポンサーリンク

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の開発プロジェクトで、データベースがMySQLJPAhibernateの前提でいきます。なにを使っているかは設定ファイルで確認できます。

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がログに出力されるようになりましたか!?

出力されない場合は、定義ファイルにミスがある場合が多いです。特にYAMLファイルの場合は、インデントがズレているときちんとセクションとして認識されないので注意が必要です。

コメント

タイトルとURLをコピーしました