1

我正在开发一个使用 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。

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

4

1 回答 1

2

一些可能对您有所帮助的评论。

  1. 您可以在构建会话工厂后对其进行序列化。有关更多信息,请参阅此博客文章。或者谷歌serialise sessionfactory nhibernate,因为有很多文章

  2. 如果这是一个网站,那么我将始终确保它启动并且永远不会停止不活动。一种方法是在正常运行时间机器人上注册一个免费帐户,该帐户每 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();
    }
于 2015-05-12T06:37:13.833 回答