2010-12-02 58 views
3

我们正在构建一个移动应用程序,我们正在评估NHibernate + Fluent的使用。问题是,我们第一次创建ISessionFactory时,需要2分钟的时间。即使表格结构非常简单(3个表格)。缓存流利的NHibernate ISessionFactory

之后每次通话都非常快。

我想要做的是在应用程序重新启动之间缓存ISessionFactory,或者以某种方式加速创建它。

任何想法是否有可能缓存?从我所有的阅读中,没有太多的加速。

回答

0

当构建配置和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分钟?

+0

是的,我们已经做到了这一点,这就是我们如何发现这个特定项目的时间如此漫长。只是要清楚,当我们在非移动模拟器上执行此操作时(例如在Windows计算机中),需要几毫秒。它只是在设备上(和模拟器它很慢)。 – 2010-12-02 23:56:17

+0

哎。我从来没有试图在移动设备上运行NHibernate。可能是较慢的处理器,较小的内存大小和不同的运行时间的组合。 (我假设你在.NET Compact Framework上运行)。我认为Phill上面关于序列化配置的建议值得研究。 – 2010-12-03 00:10:52

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(); 
     } 
    } 
+0

我的问题不是会话工厂被持久化在应用程序实例中,而是它变得缓慢的应用程序实例之间。因此,这并不能真正帮助我。我们正在尝试缓存。 – 2010-12-02 23:54:27

4

你可以序列化并保存配置并在第二次加载时减少创建所需的时间。如果您进行了更改,则需要删除旧配置并序列化新版本,否则您将加载旧配置。

我不记得代码做这个寿,会尝试挖掘一个例子。

编辑: http://vimeo.com/16225792

在这个视频在Ayende大约为24分钟讨论配置序列化。