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"。
你可以做的是创建另一个静态方法来允许你关闭会话,但你必须控制何时关闭它(在网络环境中,它可能在每个请求的末尾),或者您可以使用一些依赖注入框架,例如 NInject 或 Castle Windsor 来控制 Session 对象的生命周期。
看看这个:
(Yet another) nHibernate sessionmanager for ASP.NET (MVC)
Effective NHibernate Session management for web apps
我有一个使用 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"。
你可以做的是创建另一个静态方法来允许你关闭会话,但你必须控制何时关闭它(在网络环境中,它可能在每个请求的末尾),或者您可以使用一些依赖注入框架,例如 NInject 或 Castle Windsor 来控制 Session 对象的生命周期。
看看这个:
(Yet another) nHibernate sessionmanager for ASP.NET (MVC)
Effective NHibernate Session management for web apps