Свободное кеширование NHibernate ISessionFactory - PullRequest
3 голосов
/ 02 декабря 2010

Мы создаем мобильное приложение, и мы оцениваем NHibernate + Fluent для его использования.Проблема в том, что когда мы впервые создаем ISessionFactory, это занимает целых 2 минуты.хотя структура таблиц очень проста (3 таблицы).

каждый вызов после этого очень быстр.

я бы хотел либо кэшировать ISessionFactory между перезапусками приложения, либокак-то ускорить его создание в первую очередь.

Есть идеи по поводу возможности кеширования?Судя по всему моему прочтению, его не так много.

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

Вы можете сериализовать и сохранить конфигурацию и загрузить ее во второй раз, чтобы сократить время, необходимое для создания. То есть, если вы вносите изменения, вам нужно удалить старый конфиг и сериализовать новую версию, в противном случае вы загрузите старую конфигурацию.

Я не могу вспомнить код, чтобы сделать это, но попробую откопать пример.

Edit: http://vimeo.com/16225792

В этом видео около 24 минут в Айенде обсуждается сериализация конфигурации.

2 голосов
/ 02 декабря 2010

Определение вашего ISessionFactory в качестве статической переменной (Shared for VB) и его создание только один раз при запуске приложения - вот как веб-приложения обходят это. Я понимаю, что это может создать проблему для мобильного приложения с требованиями к эффективности памяти, но в зависимости от используемой мобильной платформы срок службы приложения может быть не таким коротким, как можно было бы опасаться ...

    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 голосов
/ 02 декабря 2010

При создании 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 минуты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...