Я знаю, что это популярная проблема, и другие решения были предложены другим, но моя немного отличается.NHibernate внезапно очень медленно - необъяснимое поведение
Во-первых, это началось внезапно с двух дней назад, и ничто не изменилось на уровне NHibernate, чтобы объяснить такое изменение в поведении.
Я использовал dotTrace и развернулся к нему и обнаружил, что для выполнения некоторых кешированных запросов требуется до 70 секунд (т. Е. Метод GetAllCountries(), который возвращает список объектов страны).
70 секунд довольно сумасшедший для такого простого запроса, который не имеет внешних ссылок.
dotTrace показывает, что он называется CachedCountryService, который должен немедленно вернуть список. Вместо этого он в конечном итоге приводит к CountryService, который выполняет 70 секунд чтения.
База данных - mySQL.
Присоединенное изображение отчета dotTrace
Объект Страна выглядит следующим образом:
public class CountryMapping : ClassMap<Country>
{
public CountryMapping()
{
Table("ma_tbl_country");
Id(t => t.Id, "id");
Map(t => t.Code, "code");
Map(t => t.Name, "name");
Map(t => t.Match, "`match`");
References(t => t.RiskGroup).Column("RiskId");
HasManyToMany(t => t.PaymentOptions)
.Table("ma_tbl_country_payment_option")
.ParentKeyColumn("country_id")
.ChildKeyColumn("payment_option_id").Cascade.SaveUpdate();
}
}
инициализаторе не влияет на объект страны, хотя Управление и счета используются в anoher NHibernate, который работает очень плохо (занимает 30 секунд).
public NHibernateInitializer()
{
base.
ExtraConfiguration =
t =>
t.Mappings(s => s.FluentMappings.AddFromAssemblyOf<DAL.Mappings.OfficeMapping>().Conventions.Add(typeof(DisableLazyLoadConvention)))
.Mappings(s => s.FluentMappings.AddFromAssemblyOf<AccountMapping>().Conventions.Add(AutoImport.Never()));
}
И DefaultLazyConvention является частью внутренней библиотеки, которая делает это:
public class DisableLazyLoadConvention : IHibernateMappingConvention, IConvention<IHibernateMappingInspector, IHibernateMappingInstance>, IConvention
{
public void Apply(IHibernateMappingInstance instance)
{
instance.Not.DefaultLazy();
}
}
UPDATE:
Я добавил уровень SQL профилирование и результаты buffling.
У меня есть два разных проекта, выполняющих один и тот же код, и я получаю запросы на 324 sql в медленных проектах, выполняющих 100 секунд для запуска, а затем 324 ИДЕНТИЧЕСКИХ запросов в другом проекте, занимающих 1 секунду!
Таким образом, я считаю, что проблема заключается в конфигурации NHibernate, а не в коде, потому что эти два набора запросов идентичны с использованием одних и тех же моделей домена. Они также используют одну и ту же базу данных с одним и тем же пользователем.
У вас установлен уровень регистрации NHibernate на «DEBUG»? Попробуйте изменить его на «WARN» или «ERROR». –
Я вижу изображение просто отлично. –
У меня есть это ВСЕ, потому что я пытаюсь просмотреть запросы. До того, как он был на ERROR, и он ничего не записывал. Запросы не терпят неудачу, они просто берут навсегда. И это только конкретные запросы – Nick