此会话提供程序是否适用于Web?

时间:2009-08-18 17:46:02

标签: performance nhibernate fluent-nhibernate

用流利的方式学习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();
        }
    }

这是我应该如何获取会话对象吗?对于高流量网站来说,这是“最快”的方式吗?

2 个答案:

答案 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开发者创建新会话的费用的简短帖子(剧透:它很便宜)

What is the cost of opening a session