2010-12-02 126 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分鐘討論配置序列化。