1

永続化のために ESENT を使用する ASP.NET アプリケーションについて考えています。

現時点では、これは私の趣味のプロジェクトなので、要件は非常に柔軟です。ただし、Windows 7、Windows 2008、および 2008 R2、.NET 3.5 以降、およびデフォルトの IIS 設定で動作することを望みます。

ESENT では、ほとんどの操作でセッション オブジェクトを開く必要があります。ドキュメントには、「セッションは使用されたスレッドを追跡し、開いているトランザクションで複数のスレッドで使用されるとエラーがスローされます。」API ドキュメントでは、マネージド スレッドではなく、ネイティブ スレッドについて言及しています。

セッションを開く操作は比較的コストがかかると思います。そのため、HTTP 要求ごとにセッションを開いたり閉じたりしたくありません。

最後に質問です。

C#コードを実行するすべてのネイティブスレッドで、asp.netで何かを1回だけ初期化/初期化解除するにはどうすればよいですか?

以下に投稿されたようなコードは機能しますか?

BeginThreadAffinity メソッドを使用して、asp.net マネージ スレッドを常にネイティブ スレッドに固定しておくことに何か問題があるのでしょうか。IIS が 1 か月間再起動せずに負荷をかけられた後、セッションがリークすることはありませんか?

前もって感謝します!

class MySession: IDisposable
{
    [ThreadStatic]
    private static MySession s_session = null;

    public static MySession instance
    {
        get
        {
            return s_session ?? ( s_session = new MySession() );
        }
    }

    private MySession()
    {
        Thread.BeginThreadAffinity();
        // Open a new session, store the handle in non-static data member.
    }

    void IDisposable.Dispose()
    {
        // Close the session.
        Thread.EndThreadAffinity();
    }
}
4

3 に答える 3

3

良いアプローチの 1 つは、セッションのプールを作成し、スレッドにプールからセッションを取得させ、完了したらセッションを返すことです。セッションは異なるスレッドで使用できますが、トランザクションがアクティブなときにスレッド間でセッションを移行すると、ESENT はエラーを出します(ただし、その動作を無効にすることは可能です)。

ESENT を使用するいくつかの大規模なサーバー アプリは、セッション プール アプローチを採用しており、それらのアプリに適しています。

于 2010-06-29T20:03:39.527 に答える
1

現在の調査によると、page_loadで新しいセッションをインスタンス化し、page_unloadで破棄すると、インデックスをシークし、返された行ごとに他の2つのシークを実行する単純なスクリプトに対して、wcatで600 reqs/secが簡単に得られます。

つまり、esentパラメータを適切に調整すれば、セッションプールは必要ない場合があります。

上記の例は、maxsessionsを256に設定した場合です。最小キャッシュサイズを調整すると、パフォーマンスも向上します。8GBのRAMを搭載したクアッドコアテストサーバー。

于 2010-11-04T19:47:41.190 に答える
0

リクエスト間でセッションを開いたままにしておくことが本当に意図されている場合、これはおそらくこの形式では機能しません。
ファイナライザーは別のスレッドで実行され、セッションを閉じるとエラーがスローされます。
ほとんどの場合 JET_errSessionInUse - session was in use on another thread, or the session was not set or reset properly、 Dispose( ) 中の JetEndSession()にあります。

本当に ESENT を使用する必要がある場合は、スレッドの専用プールを手動で起動して管理し、それらへの/からの呼び出しをマーシャリングすることができます。

于 2010-06-27T19:17:23.900 に答える