我们正在构建移动应用程序,我们正在评估NHibernate + Fluent与它一起使用。问题是,我们第一次创建ISessionFactory时,需要整整2分钟。即使表结构非常简单(3个表)。
之后的每次通话都非常快。
我想要做的是在应用程序重启之间缓存ISessionFactory,或者首先加快它的创建速度。
关于是否可以缓存的任何想法?从我所有的阅读来看,没有太多的加速。
答案 0 :(得分:4)
您可以序列化并保存配置并第二次加载,以减少创建所需的时间。如果您进行更改,则需要清除旧配置并序列化新版本,否则您将加载旧配置。
我不记得执行此操作的代码,会尝试挖掘示例。
在Ayende约24分钟的视频中讨论了配置序列化。
答案 1 :(得分:2)
将ISessionFactory定义为静态变量(Shared for VB)并在应用程序启动时仅实例化一次是Web应用程序如何解决这个问题。 我意识到这可能对具有内存效率要求的移动应用程序构成挑战,但是根据移动平台,您使用应用程序的生命周期可能不会像人们担心的那么短......
public class NHHelper {
private static string _connectionString;
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory {
get {
if (_sessionFactory == null) {
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ShowSql()
.ConnectionString(p => p.Is(_connectionString)))
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetAssembly(typeof(NHHelper))))
.BuildSessionFactory();
}
return _sessionFactory;
}
}
// this is called once upon application startup...
public static void WarmUpSessionFactory(string connectionString) {
_connectionString = connectionString;
var factory = SessionFactory;
}
// this is what you call to get a session for normal usage
public static ISession OpenSession() {
return SessionFactory.OpenSession();
}
}
答案 2 :(得分:0)
构建Configuration和ISessionFactory时,NHibernate正在解析配置和映射以构建其运行时数据结构。 (对于EF和LINQ-to-SQL也是如此,尽管它隐藏在上下文中。)虽然2分钟似乎非常长,但没有太多可以做的来消除这个成本。计时这段代码:
var stopwatch = new Stopwatch();
stopwatch.Start();
var cfg = new Configuration();
cfg.Configure();
var sessionFactory = cfg.BuildSessionFactory();
stopwatch.Stop();
Console.WriteLine("Startup time was " + stopwatch.ElapsedMilliseconds + "ms");
这是一个演示项目,只有几个类和映射,但是没有连接调试器需要大约850毫秒。附加调试器后,大约需要2秒钟。
您是否尝试过分析您的应用以了解它花费2分钟的时间?