【问题标题】:Speed up the NHibernate SessionFactory create process加快 NHibernate SessionFactory 创建过程
【发布时间】:2015-05-10 20:54:49
【问题描述】:

我正在开发一个使用 Asp .Net MVC 和 NHibernate 作为 ORM 工具的网站。 我只是使用一些原则实现了一些模式。 它们是 IoC、Service-Repository 和 UoW。

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

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

到目前为止一切都很好,我可以在 1 秒内加载整个网站,总共几乎 7,5 MB 大小(主要是来自 Azure 存储的图像),而不需要 Asp .Net MVC 的 outputcache 和上述基础设施,但是这个动作正在发生当我第二次加载网站时。

最大的问题是 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。

有什么想法或建议吗? 谢谢

【问题讨论】:

    标签: nhibernate fluent-nhibernate sessionfactory uptime


    【解决方案1】:

    几个可能对你有帮助的 cmets。

    1. 您可以在构建会话工厂后对其进行序列化。请参阅此blog post for more info。或者谷歌serialise sessionfactory nhibernate,因为有很多文章

    2. 如果这是一个网站,那么我将始终确保它处于启动状态并且永远不会在不活动时停止。一种方法是在uptime robot 上注册一个免费帐户,该帐户每 5 分钟 ping 您的网站(要求提供标题),从而使其保持活动状态。但是,在任何更改架构的部署中,您的启动时间仍然会很慢。

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

    【讨论】:

    • 感谢您的 cmets。我不确定第一个建议是否适用于流畅的配置。我阅读了解决 hbm.xml 文件问题的相关文章,但实际上并没有 fluent api。顺便说一句,我要试一试。实际上,第二个建议是一个好技巧,我今天早上只是实施了一个类似的解决方案,现在效果很好。我不确定这是一个好的解决方案,但它确实有效。
    • 从大约 20 秒到大约 8 秒,刚刚超过一半。它仍然很慢,但更易于管理。该解决方案应该适用于流利的(我相信那里有文章)
    • 好的。我将尝试使用我的设置。谢谢@Rippo
    • 在客户端设置刷新方法解决了整个问题。节省了将近 12-13 秒。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2011-01-22
    • 2012-11-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2015-01-15
    • 2012-03-11
    相关资源
    最近更新 更多