1

流暢な NHibernate を使用する ASP.NET MVC4 Web API がありますが、デバッグを実行すると、データベースを使用するサイトに初めてアクセスするのに 1 分半かかります。それをどう活かすか、

ライブサーバーで実行すると、セッションデータをガベージコレクションする必要があります。これは、長時間使用していない場合、再度構成するのに時間がかかるためです。

1.5 分ではなく 10 秒未満に短縮することは可能ですか?

私の現在の SessionFactory クラスは次のようになります

public class SessionFactory
{
    private static readonly string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ConnectionString;

    private static ISessionFactory _session;
    private static readonly object SyncRoot = new Object();

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MySQLConfiguration
            .Standard
            .ConnectionString(ConnString))
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<UserMap>())
                .ExposeConfiguration(UpdateSchema)
                .BuildSessionFactory();
    }

    private static void UpdateSchema(Configuration cfg)
    {
        new SchemaUpdate(cfg).Execute(false, true);
    }

    public static ISession Session
    {
        get
        {
            if (_session == null)
            {
                lock (SyncRoot)
                {
                    if (_session == null)
                        _session = CreateSessionFactory();
                }
            }
            return _session.OpenSession();
        }
    }
}

これは dotTrace のスクリーンショットですここに画像の説明を入力

私のホストでリクエストのタイミングを計ると、最初のリクエストに1分50秒かかり、それは「ライブ」サーバー上にあります(そこでIISを制御できません)

4

1 に答える 1

2

このコードには多くの問題があります。CreateSessionFactoryは、アプリケーションの存続期間中に1回だけ呼び出す必要があります。global.asaxに静的変数を作成し、Application_Start()でCreateSessionFactoryを1回呼び出します。また、global.asaxで、Application_BeginRequestおよびApplication_EndRequestのいくつかのイベントを設定する必要があります。ここで、セッションを作成して破棄します。これは、Webアプリケーションでの作業単位です。また、セッションをHttpContextに保存する必要があります。

public static ISession CurrentSession
{
    get { return (ISession)HttpContext.Current.Items[sessionkey]; }
    set { HttpContext.Current.Items[sessionkey] = value; }
}

protected void Application_BeginRequest()
{
    CurrentSession = SessionFactory.OpenSession();
}

protected void Application_EndRequest()
{
    if (CurrentSession != null)
        CurrentSession.Dispose();
}

コードは、セッションが必要になるたびにSessionFactoryを再作成します。

于 2012-10-09T15:13:36.313 に答える