Быстрая ошибка конфигурации Nhibernate во много приложении потока

Я создал много приложение потока на IIS (ASP.NET MVC), Когда сервер поточной обработки запустился, это создает 10 потоков, и это - execting workitems в потоки.

Обычно мое приложение, работающее хорошо, но некоторое время, у меня есть ошибки и я уверен, что проблема возникает из быстрой конфигурации. И я уверен снова, что я сделал некоторую ошибку :)

Вот мой Класс SessionFactory:

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 );

Я видел, что, когда я запустил сервер некоторое время, он имеет объект работы вызова 300.000 для тестовой цели успешно. Но когда-то это дает ошибкам приблизительно 2-3 workitem.

Исключение:

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

Внутренний excetion:

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

Любое предложение или справка приветствуются

5
задан fyasar 9 March 2010 в 21:33
поделиться

1 ответ

Похоже, что метод CreateSessionFactory вызывается несколько раз. Доступ к статическому полю sessionFactory не синхронизируется в этом методе, что делает его небезопасным для потоков:

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

Всегда синхронизируйте доступ к общим ресурсам в многопоточных приложениях. В этой ситуации часто используется шаблон, называемый singleton .

7
ответ дан 14 December 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: