4

MyBatisが私のアプリケーションで遅いのはなぜだろうと思います。

の場合SELECT COUNT(*)、かかる時間は次のとおりです。

  1. 20秒-最初のリクエスト
  2. 2-3秒-後続のリクエスト

キャッシングは、おそらく、後続のリクエストをより速くします。

構成

  • 3層(WPF UI-Javaバックエンド-Oracleデータベース)
  • JBoss Serverは、JavaBackedをWPFUIのWebサービスとして公開します
  • 要求時間==WPFUIが結果を送信してから受信するまでにかかる時間
  • 使用されているSpringFramework

試みたアプローチ

  1. 無効なロギング

    ロギングサブシステムとlog4jの両方を無効にすることが違いを生むかどうかはわかりません。しかし、私が得た最高の時間は15秒でしたSELECT COUNT(*)

  2. キャッシングと遅延読み込みを無効にする

    これもおそらく最大で5秒の違いをもたらしました。

次の助けはありますか?

  1. 自動マッピングをオフにすることにより、明示的な結果マッピングを使用します。(ここの結果マップを参照してください)。
  2. プーリングの使用。(ここで環境を参照してください)。
  3. トランザクションは、サブクエリを使用したSQLステートメントの高速化に役立ちますか?

上記のテクニックはここにリストされています:

  1. MyBatisフォーラム
  2. JBossのベストプラクティス(ページ9)

もう一つの例

2つの結合と1つのサブクエリを持つネストされたSQLステートメントの場合、かかる時間は次のとおりです。

  1. 60〜90秒-最初のリクエスト
  2. 2-3秒-後続のリクエスト
4

1 に答える 1

8

私は問題を解決しました!MyBatisは、データベースに対して直接実行するのと同じくらいクエリに時間がかかるようになりました。

それはN + 1選択の問題でした(ここでうまく説明されています)。

解決

ネストされた結果(ネストされた選択とは対照的に)。これも上記の同じページで説明されています。

4 つの結合を使用した SQL クエリとの違いは非常に大きかったです。

  • 前: 38秒
  • 後: 3 秒

MyBatis-Spring ( JBoss部分を削除) に関するJUnitテストケースに問題を分離することで、問題を突き止めました。

于 2012-11-15T15:55:48.027 に答える