1

我有一个使用 fluent NHibernate 的 ASP.NET MVC4 web api,但是当我运行调试时,我第一次尝试访问任何使用数据库的站点需要 1.5 分钟,所以我发现Fluent nHibernate 启动时间慢,但我不确定如何利用它,

当它在实时服务器上运行时,它必须垃圾收集会话数据,因为如果我很长时间没有使用它,它需要很长时间才能再次配置。

是否有可能将其缩短到 10 秒以下而不是 1.5 分钟?

我当前的 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 应该只在应用程序的生命周期中被调用一次。在 global.asax 中创建一个静态变量,并在 Application_Start() 中调用一次 CreateSessionFactory。同样在 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 回答