用流利的方式学习nhibernate,我的会话提供者看起来像:
public class SessionProvider
{
private static ISessionFactory sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString( c => c.FromAppSetting("sqlserver")))
.Mappings( m => m.FluentMappings.AddFromAssemblyOf<UserMapping>())
.BuildSessionFactory();
}
return sessionFactory;
}
}
private SessionProvider()
{ }
public static ISession GetSession()
{
return SessionFactory.OpenSession();
}
}
这是我应该如何获取会话对象吗?对于高流量网站来说,这是“最快”的方式吗?
答案 0 :(得分:0)
“最快”将是在整个应用程序生命周期中简单地保持1个会话,但这也是相当愚蠢的:P(好吧,现在有多核,我甚至不确定这是否是最快的)。 / p>
一切似乎都很好。请记住,GetSession()会在每次调用时打开一个新会话。就个人而言,我喜欢每个HttpRequest保持1个会话,又名:
public static ISession GetSession()
{
if (HttpContext.Current.Items[SESSION_KEY] == null)
{
HttpContext.Current.Items[SESSION_KEY] = SessionFactory.OpenSession();
}
return HttpContext.Current.Items[SESSION_KEY] as ISession;
}
private const string SESSION_KEY = "kahsdmiashdohbasduhfasduybadsubdsabsd";
您还可以检查会话状态(关闭,脏,打开?),并采取相应措施,而不仅仅是“延迟初始化”。
[编辑] BTW,似乎你不想让你的类实例化(私有构造函数,所有静态成员)。您应该将该类声明为静态,例如public static class MyClass{}
。这将使得类不能包含非静态成员,并且无法实例化。
答案 1 :(得分:0)
这里有一篇关于NHibernate开发者创建新会话的费用的简短帖子(剧透:它很便宜)