时间:2010-12-02 01:51:37

标签: nhibernate fluent-nhibernate

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

之后的每次通话都非常快。

我想要做的是在应用程序重启之间缓存ISessionFactory,或者首先加快它的创建速度。

关于是否可以缓存的任何想法?从我所有的阅读来看,没有太多的加速。

3 个答案:

答案 0 :(得分:4)

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

我不记得执行此操作的代码,会尝试挖掘示例。

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

在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分钟的时间?