NHibernate 性能和可扩展性

NHibernate Performance and Scalability

我有一个使用 NHibernate 连接到 MSSQL 数据库的 Web 表单站点。

我使用以下 class 创建 SessionFactory 并获取要使用的当前会话:

internal static class SessionManager
{
    static readonly Configuration Configuration = new Configuration().Configure();
    internal readonly static ISessionFactory SessionFactory = Configuration.BuildSessionFactory();

    internal static ISession CurrentSession { get { if (!CurrentSessionContext.HasBind(SessionFactory))CurrentSessionContext.Bind(SessionFactory.OpenSession()); return SessionFactory.GetCurrentSession(); } }
}

这是我如何使用前一个的示例:

public abstract class Repository<TEntity>
{

    protected internal ISession Session { get { return SessionManager.CurrentSession; } }

    public IQueryable<TEntity> AllItems { get { return Session.Query<TEntity>(); } }

}

一切正常,虽然我认为我在性能和可伸缩性方面做得非常糟糕,但我看不出是什么。

谁能告诉我什么是 and/or 建议更好的处理方法?

提前致谢!

我认为你的代码中的主要问题是,当你将Session对象作为静态字段放在静态class中时,你将整个过程只有一个会话,这能给你带来什么问题,例如 "a different object with the same identifier value was already associated with the session"。

你可以做的是创建另一个静态方法来允许你关闭会话,但你必须控制何时关闭它(在网络环境中,它可能在每个请求的末尾),或者您可以使用一些依赖注入框架,例如 NInjectCastle Windsor 来控制 Session 对象的生命周期。

看看这个:
(Yet another) nHibernate sessionmanager for ASP.NET (MVC)
Effective NHibernate Session management for web apps