0

セッションごとの要求パターンを使用して、ASP Web アプリケーションで nHibernate を使用しています。ユーザーが実行できるアクションの中には、数百の INSERT ステートメントと UPDATE ステートメントが発生し、完了までに数秒かかるものがあります。これにより、トランザクション全体がデータベースにコミットされるまでユーザーは自分のアクションの結果を確認できないため、パフォーマンスが低下します。

ところで、以前は結果をセッションに保存しましたが、これも良い解決策ではありません。セッションに何かを書き込むと、読み取り/書き込みロックが発生し、同時要求が順番に処理されます。したがって、長いリクエストは、完了するまで他のリクエストをブロックします。そのため、結果をデータベースに書き込むことに切り替えましたが、説明したように、これには独自の問題があります。

この問題にどのようにアプローチできますか?結果がバックグラウンドでコミットされている間に、何らかの方法で結果 bakc をブラウザーに送信することしか考えられません。それが可能であれば、セッションがブラウザからのリクエストに結合されているため、どうすればよいかわかりません。しかし、多分それは可能ですか?または、うまくいく解決策はありますか?

編集

  • Guid.Comb 識別子戦略を使用しています
  • コミットのサイズを把握するには、1 つのコミットに 2000 を超える INSERT および UPDATE ステートメントが含まれ、操作の実行中に同様の量の SELECT ステートメントが発行されます。コミットが完了するまでに 2 ~ 4 分かかります (そんなに長いですか?)。

十分な情報を提供していない場合はお尋ねください。解決策を探すべき方向がわからないので、現時点でここに何を書くのが面白いのかよくわかりません。

4

2 に答える 2

0

コードを投稿していませんが、ほとんどの場合、NHibernate でバッチを使用するとパフォーマンスが向上します。より大きいバッチ サイズを設定すると、データベースへのラウンドトリップが少なくなります。ただし、一部のコードを書き直す必要がある場合があります。

<property name="adonet.batch_size">1000</property>

バッチサイズを構成します。

2 番目のオプションは、ISession の代わりに IStatelessSession を使用することです。パフォーマンスは向上しますが、状態はありません。

于 2013-06-12T15:27:05.517 に答える