2015-05-10 3 views
1

Я разрабатываю веб-сайт с использованием Asp .Net MVC и NHibernate в качестве инструмента ORM. Я только что реализовал некоторые шаблоны, используя некоторые принципы. Это IoC, Service-Repository и UoW.Ускорить процесс создания SessionFactory NHibernate

Я использую почти все возможности NHibernate с точки зрения кэширования, как ниже

  • Ленивая Загрузка
  • Cache второго уровня
  • Query Cache
  • Entity Cache

Up до сих пор все было в порядке, я могу загрузить весь веб-сайт за 1 секунду размером почти 7,5 МБ (в основном изображения из Azure Storage) с ut Asp .Net MVC с указанной инфраструктурой, но это действие происходит, когда я загружаю веб-сайт во второй раз.

Большая проблема - NHibernate. SessionFactory добавляет почти 15 секунд к времени безотказной работы проекта, когда это первая загрузка, и это неприемлемо.

У меня есть 25 объектов, и поэтому их сопоставления на самом деле, почему это занимает так много времени в первый раз?

Вот моя конфигурация для NHibernate

public static ISessionFactory GetSessionFactory() 
{ 
     return Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2012 
     .Raw("connection.isolation", "ReadCommitted") 
     .ConnectionString("connectionString") 
     .Mappings(gX => gX.FluentMappings.AddFromAssemblyOf<MyEntity>()) 
     .Cache(gX => gX.ProviderClass<SysCacheProvider>() 
     .UseSecondLevelCache() 
     .UseQueryCache()) 
     .BuildSessionFactory(); 
} 

У меня нет каких-либо проблем в процессе создания в SessionFactory, кстати. Единственная проблема - это время моего проекта в первый раз. Я просто решил много проблем с помощью стратегий кэширования, но не смог понять SessionFactory.

Любая идея или предложение об этом? Thanks

ответ

2

Пара комментариев, которые могут вам помочь.

  1. После сборки вы можете сериализовать свою сессионную лабораторию. См. Это blog post for more info. Или Google serialise sessionfactory nhibernate как есть много статей

  2. Если это веб-сайт, то я всегда буду убеждаться, что он развернут и никогда не останавливается на бездеятельности. Один из способов - зарегистрироваться на бесплатную учетную запись на uptime robot, которая каждые 5 минут пингует ваш сайт (запрашивает заголовки), тем самым сохраняя его. Однако при любом развертывании, которое меняет схему, вы все равно получите медленное время запуска.

Ниже как я сериализация в NHibernate SessionFactory вы должны быть в состоянии адаптировать его с постом в блоге выше, чтобы соответствовать вашим потребностям. Я видел, как люди использовали директиву #Debug или время создания файла, чтобы узнать, нужно ли регенерировать файл.

private static ISessionFactory SetUpNhibernate() 
    { 

     var file = HttpContext.Current.Server.MapPath("~/App_Data/cfg-serialised.xml"); 
     IFormatter serializer = new BinaryFormatter(); 
     var cfg = new Configuration(); 

     if (File.Exists(file)) 
     { 
      using (var stream = File.OpenRead(file)) 
      { 
       cfg = serializer.Deserialize(stream) as Configuration; 
      } 
     } 
     else 
     { 
      var mapper = new ModelMapper(); 
      mapper.AddMappings(typeof(CmsMeta).Assembly.GetTypes()); 
      var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); 
      cfg.Configure(); 
      cfg.AddDeserializedMapping(mapping, "Domain"); 
      using (var stream = File.OpenWrite(file)) 
      { 
       serializer.Serialize(stream, cfg); 
      } 
     } 

     return cfg.BuildSessionFactory(); 
    } 
+0

Спасибо за ваши комментарии. Я не уверен, что первое предложение будет работать с хорошей конфигурацией. Я прочитал связанную статью, которая решает проблему с файлами hbm.xml, но не говорит об истинном api. Я собираюсь дать попробовать кстати. На самом деле предложение seccond - хороший трюк, и я просто имитирую подобное решение сегодня утром и хорошо работаю. Я не уверен, что это хорошее решение, но оно работает. – revolver

+0

Сколько секунд вы спасли от своего решения? – revolver

+0

прошло от 20 секунд до примерно 8 секунд, чуть более половины. Его все еще медленный, но более управляемый. Решение должно работать с беглостью (я уверен, что там есть статьи) – Rippo

Смежные вопросы