代码之家  ›  专栏  ›  技术社区  ›  fyasar

多线程应用中的Fluent NHibernate配置错误

  •  5
  • fyasar  · 技术社区  · 15 年前

    我在IIS(ASP.NET MVC)上创建了一个多线程应用程序,当线程服务器启动时,它将创建10个线程,并将工作项执行到线程中。

    通常我的应用程序工作得很好,但有时我会出错,我确信问题来自于流畅的配置。我敢肯定我又犯了一些错误:)

    以下是我的课程:

    public class NHibernateHelper
    {
        private static ISessionFactory sessionFactory;
    
        /// <summary>
        /// SessionFactory is static because it is expensive to create and is therefore at application scope.
        /// The property exists to provide 'instantiate on first use' behaviour.
        /// </summary>
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (sessionFactory == null)
                {
                    sessionFactory = CreateSessionFactory();
                }
                return sessionFactory;
            }
        }
    
    
        /// <summary>
        /// CreateSessionFactory
        /// </summary>
        /// <returns></returns>
        private static ISessionFactory CreateSessionFactory()
        {
            IPersistenceConfigurer dbConfigurer = MsSqlConfiguration.MsSql2005
                .ConnectionString("connection string ..")
                                .Cache(c => c
                                    .UseQueryCache()
                                    .ProviderClass<NoCacheProvider>()
                        ).ShowSql()
                        .CurrentSessionContext<ThreadStaticSessionContext>(); 
                        return Fluently
                                .Configure()
                                .Database(dbConfigurer)
                                .Mappings(mc =>
                                {
                                    mc.FluentMappings.Add(typeof(UserMap));
                                    mc.FluentMappings.Add(typeof(ApplicationMap));
                                    mc.FluentMappings.Add(typeof(SubscriptionsMap));
                                })
                            .BuildSessionFactory();
        }
    
    
        public static ISession GetCurrentSession()
        {
            if (!CurrentSessionContext.HasBind(SessionFactory))
            {
                CurrentSessionContext.Bind(SessionFactory.OpenSession());
            }
            return SessionFactory.GetCurrentSession();
        }
    
    
    
        public static void DisposeSession()
        {
            var session = GetCurrentSession();
            session.Close();
            session.Dispose();
        }
    
        public static void BeginTransaction()
        {
            GetCurrentSession().BeginTransaction();
        }
    
        public static void CommitTransaction()
        {
            var session = GetCurrentSession();
            if (session.Transaction.IsActive)
                session.Transaction.Commit();
        }
    
        public static void RollbackTransaction()
        {
            var session = GetCurrentSession();
            if (session.Transaction.IsActive)
                session.Transaction.Rollback();
        }
    }
    

    每一个线程都在调用NHibernateHelper类,并且该行在其内部;

                var myobjectinstance = new ObjectInstance();
                NHibernateHelper.GetCurrentSession().Save( myobjectinstance );
    

    我看到了,当我启动服务器一段时间后,它成功地调用了300000个工作项来进行测试。但有时它会给出2-3个工作项的错误。

    例外情况是:

    [0] = {"An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.\r\n\r\n"}
    

    内部超标为:

    Object reference not set to an instance of an object.
    

    内部异常堆栈跟踪为:

        at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
        at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
        at NHibernate.Impl.SessionFactoryObjectFactory.AddInstance(String uid, String name, ISessionFactory instance, IDictionary`2 properties)
        at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
        at NHibernate.Cfg.Configuration.BuildSessionFactory()
        at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() 
        in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 93
    

    欢迎任何建议或帮助

    1 回复  |  直到 15 年前
        1
  •  7
  •   Darin Dimitrov    15 年前

    看起来像 CreateSessionFactory 方法被多次调用。这个 sessionFactory 此方法中的静态字段访问不同步,这使其不具有线程安全性:

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (sessionFactory == null)
            {
                sessionFactory = CreateSessionFactory();
            }
            return sessionFactory;
        }
    }
    

    确保在多线程应用程序中始终同步对共享资源的访问。在这种情况下有一个常用的模式叫做 singleton .

    推荐文章