永続化のために 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();
}
}