我有一个使用流畅的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
的屏幕截图在我的主机上定时请求,初始请求需要1分50秒,那就是“实时”服务器(我无法控制IIS)
答案 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。