如何加快我的Nhibernate配置

时间:2012-10-06 11:23:04

标签: fluent-nhibernate asp.net-mvc-4

我有一个使用流畅的NHibernate的ASP.NET MVC4 web api,但是当我运行调试时,我第一次尝试访问任何使用数据库的站点需要1½分钟,所以我找到Fluent nHibernate Slow Startup Time但是我我不确定如何利用它,

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

是否可以将其降低到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 enter image description here

的屏幕截图

在我的主机上定时请求,初始请求需要1分50秒,那就是“实时”服务器(我无法控制IIS)

1 个答案:

答案 0 :(得分: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。