NHibernate:让会话单例是一个不好的做法吗?

本文关键字:一个 会话 单例 NHibernate | 更新日期: 2023-09-27 18:07:06

在我的应用程序中,会话作为SessionManager类中的单例对象。每当我需要在应用程序的某些部分使用它时,我就这样做:

 using (var session = SessionManager.OpenSession())
 {
 }

这可能是一个不好的做法吗?如果是这样,你有什么建议吗?

EDIT:下面是会话管理器

的实现
 public static class SessionManager
    {
        private static readonly ISessionFactory sessionFactory;

        static SessionManager()
        {
            sessionFactory = Fluently.Configure().....
        }

        public static ISessionFactory SessionFactory
        {
            get { return sessionFactory; }
        }

        public static ISession OpenSession()
        {
            return sessionFactory.OpenSession();
        }
    }

NHibernate:让会话单例是一个不好的做法吗?

请注意,会话是不是线程安全的!因此,应该只有一个ISessionFactory,但是每个线程一个isession。

不,它应该是单例的,这样它可以在应用程序内的不同线程之间共享。由于这些对象是重量级的,因为它们包含连接信息、hibernate配置信息和映射文件、位置路径。因此,创建大量实例将使我们的应用程序变得很重。但是会话对象不是线程安全的。

只有需要不同配置的多个工厂的应用程序才有明显的理由创建和关闭多个SessionManager实例。