我使用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。
有关它的任何想法或建议吗? 感谢
答案 0 :(得分:2)
可能对您有所帮助的一些意见。
您可以在构建之后序列化您的sessionfactory。见blog post for more info。或Google serialise sessionfactory nhibernate
,因为有很多文章
如果这是一个网站,那么我总是会确保它被旋转,并且永远不会停止不活动。一种方法是在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();
}