NHibernate + Свободное долгое время запуска - PullRequest
3 голосов
/ 14 апреля 2010

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

setup = Windows 2003 SP2 / Oracle10gR2 последний CPU / ODP.net 2.111.7.20 / FNH 1.0.0.636 / NHibernate 2.1.2.4000 / NUnit 2.5.2.9222 / VS2008 SP1

using System;
using System.Collections;
using System.Data;
using System.Globalization;
using System.IO;
using System.Text;
using System.Data;
using NUnit.Framework;
using System.Collections.Generic;
using System.Data.Common;
using NHibernate;
using log4net.Config;
using System.Configuration;
using FluentNHibernate;

[Test()]
        public void GetEmailById()
        {

            Email result;

            using (EmailRepository repository = new EmailRepository())
            {
                results = repository.GetById(1111);
            }

            Assert.IsTrue(results != null);
        }

//In my Repository

   public T GetById(object id)
        {
            using (var session = sessionFactory.OpenSession())
            using (var transaction = session.BeginTransaction())
            {
                try
                {
                    T returnVal = session.Get<T>(id);
                    transaction.Commit();
                    return returnVal;
                }
                catch (HibernateException ex)
                {
                    // Logging here
                    transaction.Rollback();
                    return null;
                }
            }
        }

Время запроса очень мало. Получающаяся сущность действительно мала. Последующие запросы в порядке.

Кажется, начинается первая сессия.

Кто-нибудь еще видел нечто подобное?

edit1:

public RepositoryBase()
{ 
  config = Fluently.Configure()
    .Database(OracleClientConfiguration.Oracle10 
    .ConnectionString(c => c.FromConnectionStringWithKey("DBCONSTRING"))
    .Driver<NHibernate.Driver.OracleDataClientDriver>().ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MYASSEM>()) 
    .BuildConfiguration(); 

  sessionFactory = config.BuildSessionFactory(); 
}

Ответы [ 3 ]

4 голосов
/ 14 апреля 2010

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

3 голосов
/ 15 апреля 2010

Вы не должны обновлять SessionFactory каждый раз, когда создаете новый репозиторий.

SessionFactory должен создаваться только один раз за запуск приложения (включая модульные тесты). Это очень трудоемкая операция.

Если вы сделаете это изменение, ваша производительность должна вернуться к нормальной / ожидаемой производительности.

1 голос
/ 14 апреля 2010

Используете ли вы log4net на уровне DEBUG? Приложение NHibernate будет также на этом уровне, если вы не настроите его по-другому. Он регистрирует много информации на уровне DEBUG, и это очень распространенная причина медленного времени настройки. Попробуйте изменить уровень только для приложения NHibernate, например ::1001

   <log4net>
    <root>
      <appender-ref ref="SqlServerAppender" />
      <level value="DEBUG" />
    </root>
    <logger name="NHibernate">
      <level value="ERROR"/>
    </logger>
   </log4net>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...