0

レイテンシーがかなり高く (~80ms)、帯域幅が比較的広い接続を介して、MySQL (InnoDB) データベースに接続しています。

クエリの発行方法によって、クエリ時間が大幅に異なることに気付きました。次の例では、主キーによって単一の小さな行に対してクエリを実行しています。クエリ時間は次のとおりです。

  • コマンド ライン クライアント ( mysql): ~160ms
  • 生の JDBC: ~240ms
  • ハイバネート: ~400ms (~0ms 開始、~160ms 取得、~240ms コミット)
  • ハイバネート、L2: ~240ms (~0ms 開始、~0ms 取得、~240ms コミット)
  • ハイバネート、c3p0: ~880ms (~160ms 開始、~240ms 取得、~480ms コミット)
  • ハイバネート、L2+c3p0: ~640ms (~160ms 開始、~0ms 取得、~480ms コミット)

(「L2」は Hibernate の第 2 レベルのキャッシュが有効になったことを意味し、「c3p0」は c3p0 が有効になったことを意味し、「begin」、「get」、および「commit」は、クエリ中に呼び出されるさまざまなサブメソッドのタイミングです)

これらは、おおよそ「定常状態」の結果であるため、L2 キャッシュはホットであり、Hibernate の起動時間は無視されます。L2 キャッシュが有効な場合、実際には get が発行されないため、「get」は通常 0ms であると想定しています。

私の質問は次のとおりです。

  • すべてのクエリが、ネットワーク レイテンシの何倍にもなっているのはなぜですか? コマンド ライン クライアントでさえ、mysql単純なクエリに 2 回の往復が必要なようです。
  • すべての JDBC/Hibernate クエリがコマンドライン クライアントよりもずっと遅いのはなぜですか? 生の JDBC クライアントでさえ、3 回の往復が必要なようです。
  • c3p0 がすべてを悪化させるように見えるのはなぜですか? 私が知る限り、接続テストを無効にしましたが、そうでなければ物事を説明することができました.
4

2 に答える 2

1

問題に固有のアドバイスはありませんが、何が起こっているのかを理解するのに役立つデバッグ手法がいくつかあります。接続 URL に接続パラメーターを追加できる場合、JDBC ドライバーは、基本的に、ネットワークを経由するすべてのものをタイミングとともにログに記録します。

jdbc:mysql://server/database?profileSQL=true

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

これを調べるもう 1 つの方法は、tcpdump を介してネットワーク トラフィックを監視することです。Maatkit ツールの mk-query-digest は、ダンプ出力を読み取り、何が起こっているかを正確に把握するのに役立ちます。

http://www.mysqlperformanceblog.com/2009/07/01/gathering-queries-from-a-server-with-maatkit-and-tcpdump/

お役に立てれば。

于 2010-09-02T02:54:11.480 に答える
0
  • Springを使用する場合は、実際に使用したときにのみ接続を開くようにlazydatasourceを使用してください
  • パフォーマンスを向上させるには、c3p0の代わりにBoneCPを試してください。
于 2010-09-27T12:40:43.247 に答える