1

EntityFrameworkをORMとして使用するASP.NETMVCアプリケーションがあります。現在、EFObjectContextにPerWebRequestライフスタイルを使用しています

高負荷でのアプリケーションパフォーマンスのプロファイリング中に、ObjectContextの作成にボトルネックが見つかりました。

ObjectContextのライフスタイルをPooledに変更したいのですが、問題があります。

私のアプリケーションのレガシー部分には、ServiceLocatorアンチパターンがあります。そのため、ObjectContextはWebリクエストごとに何度も解決され、使用後に明示的に解放されない可能性があります。

PerWebRequestではObjectContextインスタンスが一度インスタンス化され、EndRequestイベントで保証されてリリースされるため、問題にはなりません。

デフォルトのプールされたライフスタイルでは、 Resolveメソッドの呼び出しごとに異なるObjectContextインスタンスが返されます。しかし、Webリクエストスコープで単一のインスタンスを再利用したいと思います。また、リクエストの最後に( PerWebRequestLifestyleModuleを使用して)インスタンスを自動的に解放(プールに戻す)する必要があります。

Windsor用にカスタムLifestyleManagerまたはカスタムIPoolを実装する必要があるように思われます。しかし、Windsorの経験が不足しているため、PooledとPerWebRequestのライフスタイル組み合わせる方法がわかりません。

何かアイデアをいただけますか?ありがとう。

UPD:ObjectContextの状態と再利用の理由について

パフォーマンス上の理由があります。ObjectContextの作成にはかなりの費用がかかります。私はそれを回避する方法を探しています。ObjectContextのステートフルな性質に対処し、それを再利用するための2つのアプローチがあります。

  • クエリにはステートレスコンテキスト(ChangeTrackingをオフにした状態)を使用します。コマンドの場合は、別のインスタンスを使用します。
  • プールに戻ったときにコンテキストの状態をリセットします。
4

2 に答える 2

3

ObjectContextリクエスト間で再利用しないでください。リクエスト間(および場合によってはユーザー間)の共有状態がリークします。このObjectContextクラスは再利用できるようには設計されていません。

あなたの質問では、使用しない理由が見つからなかったPerWebRequestので、それを使用してください。

于 2012-08-11T19:15:03.213 に答える
0

あなたの場合、ライフスタイルを変更して現在のスレッドに関連付け、Webアプリの各ワーカースレッドがインスタンスを取得できるようにすることができます

于 2012-08-11T18:39:49.580 に答える