加速NHibernate SessionFactory创建过程

时间:2015-05-10 20:54:49

标签: nhibernate fluent-nhibernate sessionfactory uptime

我使用Asp .Net MVC和NHibernate作为ORM工具开发网站。 我刚刚使用一些原则实现了一些模式。 这些是IoC,Service-Repository和UoW。

我使用NHibernate的几乎所有功能,如下面的缓存

  • 延迟加载
  • 二级缓存
  • 查询缓存
  • 实体缓存

到目前为止一切都很好,我可以在1秒内加载整个网站,大约总共7,5 MB大小(主要来自Azure存储的图像)没有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。

有关它的任何想法或建议吗? 感谢

1 个答案:

答案 0 :(得分:2)

可能对您有所帮助的一些意见。

  1. 您可以在构建之后序列化您的sessionfactory。见blog post for more info。或Google serialise sessionfactory nhibernate,因为有很多文章

  2. 如果这是一个网站,那么我总是会确保它被旋转,并且永远不会停止不活动。一种方法是在uptime robot上注册一个免费帐户,该帐户每5分钟对您的网站进行一次ping(请求标题),从而使其保持活跃状态​​。但是,在任何更改架构的部署中,您仍然会获得较慢的启动时间。

  3. 以下是我序列化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();
        }