0

私は Play Framework を使用しており、Hibernate によって実行されるクエリを取得したいと考えています。

コンソールにクエリを表示するための設定がapplication.conf(jpa.debugSQL = true)にあることは知っていますが、コードからこれらのクエリを取得して、ユーザーのために自分で表示することです(各ページ要求のクエリを表示する Web サイトの管理インターフェイス)。

ご協力ありがとうございました !

4

1 に答える 1

2

log4j (または他の同様のロギング フレームワーク) に精通していれば、非常に簡単に達成できるはずです。

すべてのイベントを受信するように構成されたカスタム アペンダーを作成できますorg.hibernate.SQL(これは、SQL 出力を提供するパッケージです)。このアペンダーは、すべてのイベントをFIFO bufferに入れます。これにより、最後のnログ エントリをメモリに保持できます。

残りは、webapp でバッファーの内容を表示するのと同じくらい簡単だと思います。

編集:物事がどのように見えるかの例:

log4j 構成:

<appender name="backend-appender" class="your.package.BackendAppender">
   <param name="bufferSize" value="200"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="[%t]: %m - %c - %d %x%n"/>
   </layout>
</appender>

Java コード:

public class BackendAppender extends AppenderSkeleton {
   private Collection<LoggingEvent> buffer;
   private int bufferSize = 10;
   private Layout layout;

   @Override
   protected void append(LoggingEvent event) {
       buffer.add(event);
   }

   public void close() {
   }

   public boolean requiresLayout() {
      return false;
   }

   @Override
   public void activateOptions() {
       if (buffer == null) {
          buffer = new CircularFifoBuffer<>(bufferSize);
       }
       layout = getLayout();
   }

   public List<String> getHibernateLog() {
      List<String> list = new ArrayList<>();
      for (LoggingEvent event : buffer) {
          if (event == null) {
              continue;
          }
          list.add(layout.format(event));
          // check event.getThrowableInformation() -- it signals this was an exception rather than typical log line and you need to handle this differently

      }
   }
于 2012-12-08T22:27:48.807 に答える