5

永続化のために Hibernate と HSQLDB を使用するオープン ソース Java アプリケーションがあります。私のすべてのおもちゃのテストでは、すべてが高速に実行され、すべてが良好です。ソフトウェアを数か月間連続して実行しているクライアントがいますが、その間にデータベースが大幅に拡大し、パフォーマンスが徐々に低下しました。最終的に、データベースに問題がある可能性があることに気づきました。ログ ステートメントからわかる限り、サーバー内のすべての計算は迅速に行われるため、これは DB に問題がある可能性があるという仮説と一致しています。

プログラムの通常のプロファイリングを行って、ホット スポットがどこにあり、何がかなりの時間を占めているかを把握する方法を知っています。しかし、私が知っているすべてのプロファイラーは、プログラム内の実行時間を監視し、外部リソースの呼び出しについては何の助けにもなりません。外部データベース呼び出しを使用してパフォーマンスを最適化する場所を見つけるプログラムをプロファイリングするために、人々はどのツールを使用していますか?

少し盲目的に検索すると、すでにいくつかのホット スポットが見つかりました。特定のクラスのすべてのオブジェクトを列挙して、存在するかどうかを調べる呼び出しがあることに気付きました。基準 [.setMaxResults(1)] への 1 行の変更は、その呼び出しを 0.5 秒から事実上瞬時に変更しました。また、1 回のトランザクション内でデータベースから同じ質問を何度もする場所も見られます。答えをキャッシュする方法はまだわかりませんが、本当に欲しいのは、この種のものをより体系的に探すのに役立つツールです。

4

5 に答える 5

3

残念ながら、私の知る限り、そのためのツールはありません。

ただし、次の点を確認してください。

  • 遅延読み込みではなく熱心な読み込みを使用していますか? 問題の説明によると、遅延読み込みを使用していないようです...
  • 第 2 レベルのキャッシュを有効にして適切に構成しましたか? クエリキャッシュを含めますか? Hibernate キャッシング メカニズムは非常に強力で柔軟です。
  • Hibernate Search の使用を検討しましたか? クエリによっては、Apache Lucene 上の Hibernate Search Full Text インデックスを使用すると、クエリを高速化できます (インデックス作成システムが非常に強力であるため)。
于 2009-04-24T21:50:09.693 に答える
0

かつて、あなたが探しているものを正確に実行するIronGrid / IronEye/IronTrackSqlと呼ばれるツールがありました。残念ながら、彼らは廃業しました。彼らは土壇場で彼らの製品をオープンソース化しました、しかし私はかなり長い間ソースまたはバイナリを見つけることができませんでした。

私は最近、プロファイリングにYourKitを使用しています。これは、SQL時間をプロファイリングして、最も呼び出されたステートメントと最も長く実行されているステートメントを見つけることができるためです。IronGridほど詳細ではありませんが、貴重な情報を提供します。私の最新のデータベース/休止状態のチューニングセッションでは、問題は休止状態であり、熱心な読み込みと遅延読み込みをいつどのように行っているか、そして多数のアイテムを選択するときにデフォルトの賢明なオーバーライドを追加することが判明しました。

于 2009-04-26T07:12:58.913 に答える
0

HSQLDB にはどのくらいのデータを保存していますか? すべてをファイルに保存しているだけなので、大量のデータセットを管理する場合はうまく機能しないと思います...

于 2009-04-24T22:06:22.993 に答える
0

ここで報告することがたくさんあります。いくつかの結果があり、まだ良い答えを探しています。

役立つツールをいくつか見つけました。

VisualVM ( BTrace、または組み込みの Trace を使用) はトレースに役立つと主張していますが、メソッド呼び出しのタイミングを示すツールを見つけることができませんでした。

YourKit は便利であると評判です。オープンソース ライセンスを要求しました。

私が見つけた最も有用なものは、Hibernate の組み込みの統計です。hibernate.generate_statistics trueプロパティを設定 すると、 を送信sessionFactory.getStatistics()して、どのオブジェクトが保存および取得されたか、キャッシュにどのような影響があるかについての詳細な統計を表示できます。必要な答えの 1 つを qeuryStatistics で見つけました。これは、コンパイルされた各クエリ、キャッシュのヒットとミス、クエリが実行された回数、返された行数、平均、最大、最小の実行時間を報告します。これらのタイミングにより、時間がどこに向かっているのかが非常に明確になりました。

次に、キャッシングについていくつか読みました。Razenha の提案は正しかった。[今のところ、彼の回答を正しいものとしてマークします。]hibernate.cache.use_query_cache trueプロパティに追加query.setCacheable(true);し、ほとんどのクエリに追加しました。<cache usage="read-write"/>また、いくつかの .hbm.xml ファイルに追加しました。現在、私の統計のほとんどは、キャッシュ ヒットが非常に優勢であることを示しており、パフォーマンスは大幅に向上しています。

最も明白な問題ではなく最悪の問題に対処できるように、実行タイミングを追跡するのに役立つツールがいくつか欲しいのですが、これは大きな助けになります。おそらく、上記のトレース ツールの 1 つが役立つでしょう。

于 2009-04-26T18:06:22.867 に答える
0

Terracotta 3.1 では、Terracotta 開発者コンソールを使用して、これらすべての統計をリアルタイムで監視できます。キャッシュ統計の履歴グラフを表示したり、クラスター全体またはノードごとに休止状態統計またはキャッシュ統計を表示したりできます。

Terracotta はオープンソースです。詳細とダウンロードはTerracotta for Hibernateにあります。

于 2009-06-11T07:18:55.990 に答える