我們正在構建一個移動應用程序,我們正在評估NHibernate + Fluent的使用。問題是,我們第一次創建ISessionFactory時,需要2分鐘的時間。即使表格結構非常簡單(3個表格)。緩存流利的NHibernate ISessionFactory
之後每次通話都非常快。
我想要做的是在應用程序重新啓動之間緩存ISessionFactory,或者以某種方式加速創建它。
任何想法是否有可能緩存?從我所有的閱讀中,沒有太多的加速。
我們正在構建一個移動應用程序,我們正在評估NHibernate + Fluent的使用。問題是,我們第一次創建ISessionFactory時,需要2分鐘的時間。即使表格結構非常簡單(3個表格)。緩存流利的NHibernate ISessionFactory
之後每次通話都非常快。
我想要做的是在應用程序重新啓動之間緩存ISessionFactory,或者以某種方式加速創建它。
任何想法是否有可能緩存?從我所有的閱讀中,沒有太多的加速。
當構建配置和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分鐘?
將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();
}
}
我的問題不是會話工廠被持久化在應用程序實例中,而是它變得緩慢的應用程序實例之間。因此,這並不能真正幫助我。我們正在嘗試緩存。 – 2010-12-02 23:54:27
你可以序列化並保存配置並在第二次加載時減少創建所需的時間。如果您進行了更改,則需要刪除舊配置並序列化新版本,否則您將加載舊配置。
我不記得代碼做這個壽,會嘗試挖掘一個例子。
在這個視頻在Ayende大約爲24分鐘討論配置序列化。
是的,我們已經做到了這一點,這就是我們如何發現這個特定項目的時間如此漫長。只是要清楚,當我們在非移動模擬器上執行此操作時(例如在Windows計算機中),需要幾毫秒。它只是在設備上(和模擬器它很慢)。 – 2010-12-02 23:56:17
哎。我從來沒有試圖在移動設備上運行NHibernate。可能是較慢的處理器,較小的內存大小和不同的運行時間的組合。 (我假設你在.NET Compact Framework上運行)。我認爲Phill上面關於序列化配置的建議值得研究。 – 2010-12-03 00:10:52