7

データベースに何度もアクセスしているため、休止状態でパフォーマンスの問題が発生しています。いくつかのフェッチ戦略を調査しています。アプリケーションが進化するにつれて、呼び出されている SQL ステートメントの数を確認できるように、いくつかの機能単体テストを作成したいと考えています。

呼び出されている SQL ステートメントの数を数えることができるかどうかを知りたいです。現時点では、show-sql を true に設定してから、コンソールで SQL をカウントしています。可能であればコードでこれを行いたいです。休止状態がコードでDBにヒットしているSQLの数を数えることは可能ですか?

ありがとう

編集

@Aleksander Blomskøldの返信後....

私のテストケースは

StatisticsService statisticsService = new StatisticsService();
Session session = entityManager.unwrap(Session.class);
statisticsService.setSessionFactory(session.getSessionFactory());
statisticsService.setStatisticsEnabled(true);

List<MyType> r= entityManager.createQuery("from MyType", MyType.class).getResultList();

System.out.println(statisticsService.getQueryExecutionCount());
System.out.println(statisticsService.getQueries()[0]);

クエリの実行回数は 1 で、クエリを見ると「from MyType」と表示されています。

ただし、ログにある SQL ステートメントには、MyType とそれに関連する多くのクラスを取得するための SQL ステートメントがあることがわかります。したがって、実際には、「from MyType」呼び出しのために DB にヒットしているすべての SQL を知りたいです。

私が必要とするものはより明確ですか?それとも、StatisticService を誤用しているだけですか

ありがとう

4

2 に答える 2

8

Hibernate で統計を有効にし、統計サービスを使用します。セッション ファクトリを構成するときは、必ず hibernate.generate_statistics=true を設定してください。その後、JMX またはプログラムで統計にアクセスできます。

//Enable statistics
StatisticsService statisticsService = new StatisticsService();
statisticsService.setSessionFactory(sessionFactory);
statisticsService.setStatisticsEnabled(true);

// Do queries...
//...

///Print out stats:
System.out.println(statisticsService.getQueryExecutionCount());
于 2013-06-13T20:14:16.027 に答える
3

いくつかの JDBC ラッパー/プロキシ ツールキットを試すことができます。

これはあなたのタスクに有望に見えます: JDBC Spy

特徴

  • すべての SQL ステートメントの実行時間と反復時間を記録する
  • 複数回実行されるステートメントを識別する
  • リストされたすべてのステートメントの深さを構成可能なスタック トレース
  • すべての接続、SQL ステートメント、結果セットの統計を提供します
  • 結果セットのサイズを提供します
  • すべての統計情報を取得するための API を提供します
  • 現在実行中のすべてのステートメントを一覧表示する
  • 実行されたが閉じられていないすべてのステートメントをリストする
  • ステートメントの実行時間が構成可能なしきい値を超えた場合に通知します (たとえば、トレースを介して)
  • 接続が閉じられる前に、結果セットまたはステートメントを閉じるのを忘れた場合に通知します
  • さまざまなロガーをサポート (log4j、Java ロギング、slf など)
  • カスタムリスナーによる拡張可能

しかし、log4dbcjdbc-trace-wrapperなど、他にもたくさんあります。

于 2013-06-13T20:20:14.427 に答える