Asp.Net での NHernate セッションの管理
著者:Eve Cole
更新時間:2009-06-30 16:46:38
私の理解では、Hibernate のセッションはデータベース接続に相当するようです。 Open/Closeメソッドもあるので、Hibernateのソースコードを勉強したことがないのですが、この理解は間違っているでしょうか?インターネットでセッション管理についてよく検索しました。そのほとんどは、データベース操作が必要なときの OpenSession() と、操作後の CloseSession() です。これは、最初に ADO.NET を学習し始めたときと少し似ています。 ) Connection オブジェクトを呼び出し、データの処理後に Close() を実行します。ただし、Connection を頻繁に切り替えるとシステム リソースが消費されるため、これには欠点が生じます。以前にデータ入力インターフェイスを作成したときのことを思い出します。この入力インターフェイスには多くのデータ要素があり、データベース内のデータを読み取ってバインドするために多くの DropDownList が必要だったからです。
このように、ページの Page_Load では、データベースからデータ バインディング DropDownList を取得するために、対応するオブジェクトのメソッドを 1 つずつ呼び出す必要があります。これらのオブジェクトのメソッドは独立した Connection を使用するため、それらはすべて独自の接続を持っています。独自の接続のオープンとクローズ。そのため、このページを開くのに時間がかかり、比較的遅いです。その後、DropDownList にバインドする必要があるデータを DataSet に処理し、DataSet 内の DataTable を DropDownList にバインドしました。この方法では、接続のオープン/クローズが 1 回だけ必要になります。ページの処理が大幅に高速になります。
したがって、上記のセッション管理方法はあまり適切ではないと感じます。
その後、Cuyahoga オープンソース プロジェクトでの彼のセッション管理を調べたところ、彼は「リクエストごとのセッション」モデルを使用していました。
文字通りの理解では、リクエストが破棄されるまで、リクエストごとにセッションが作成され、その後セッションが閉じられます。
Cuyahoga のアプローチは、リクエストごとに CoreRepository オブジェクトを作成するという点で、リクエストごとのアプローチとは少し異なります。 CoreRepository は、システムに必要なデータ処理サービスのクラスです。
彼が行ったのは、次のように、まず HttpModule (NHSessionModule) を作成して CoreRepository オブジェクトを作成し、CoreRepository オブジェクトを破棄することでした。
private void Context_BeginRequest(オブジェクト送信者、EventArgs e)
{
// Core オブジェクトのリポジトリを作成し、それを現在の HttpContext に追加します。
CoreRepository cr = 新しい CoreRepository(true);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
private void Context_EndRequest(オブジェクト送信者, EventArgs e)
{
// Hibernate セッションを閉じます。
if (HttpContext.Current.Items["CoreRepository"] != null)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
このようにして、リクエストが行われるたびに CoreRepository オブジェクトが自動的に作成され、リクエストが完了すると、プログラム内の HttpContext.Current.Items["CoreRepository"] を介して CloseSession() を使用して CoreRepository オブジェクトを取得できます。
このようにして、NHibernate のセッションは偽装された形式で管理され、「リクエストごとのセッション」モデルが実現されます。
詳細説明: IHttpModule を実装して Nhibernate のセッションを初期化する
操作ごとにセッションを作成する必要がある上記の方法と比較して、この方法ではパフォーマンスと速度が大幅に向上します。
そこで、すべてのリクエストがセッションを作成するのではないかと考えました。接続プールのようなセッション プールも作成できるでしょうか。
この方法では、リクエストが行われるたびにセッションを直接作成するのではなく、すでに作成されているセッションがセッション プールから取得されるので、より効率的ではないでしょうか。 !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html