Есть ли способ получить во время выполнения количество вызовов, которые NHibernate делает в базе данных?Счет в базе данных NHibernate?
Я знаю, что я могу использовать профилировщик NHibernate (NHProf, http://nhprof.com/), чтобы вручную просмотреть этот счет во время отладки - но то, что я хотел бы сделать, - во время выполнения, чтобы получить фактическое количество вызовов в базе данных, NHibernate делает так Я могу исключить исключение, если это смешное число, например, 50 или 300 (точное число будет определено).
Это будет указание разработчику, что он/она должен использовать «Eager» и «Future» и настраивать код NHibernate, поэтому сотни запросов не поступают в базу данных.
Ниже у меня есть пример, когда я вижу 284 вызовов, которые вносятся в базу данных -
Мы можем исправить этот код - так что я не ищу решение о том, как сделать этот NHibernate код лучше. Вместо этого я хотел бы внедрить систему, которая уведомит разработчиков о необходимости настройки кода Nhibernate.
Пример - Предположим, мы имеем следующую модель/дб -
клиент customeraddress заказ orderstate OrderDetail
Код ниже делает один выбрать вызов для каждой детали заказа к каждому из связанных таблиц, и т. д. Имея всего 72 детали заказа в db, мы получаем 284 звонков в базу данных.
var query = QueryOver.Of<OrderDetail>()
.Where(c => c.UpdateTime >= updateTime);
using (var context = _coreSessionFactory.OpenSession())
{
var count = query.GetExecutableQueryOver(context)
.ToRowCountQuery()
.FutureValue<Int32>();
var items = query
.OrderBy(a => a.UpdateTime).Desc
.Skip(index ?? 0)
.Take(itemsPerPage ?? 20)
.GetExecutableQueryOver(context)
.Fetch(c => c.Order.OrderState).Eager
.Fetch(c => c.Order.Customer.CustomerAddress).Eager
.Future();
return new
{
Typename = "PagedCollectionOfContract",
Index = index ?? 0,
ItemsPerPage = itemsPerPage ?? 20,
TotalCount = count.Value,
Items = items.ToList().Select(c => new
{
Typename = "OrderDetail",
c.Id,
OrderId = c.Order.Id,
OrderStateAffiliates = c.Order.OrderStates.First(n => n.Name == StateNames.California).AffiliateCount,
CustomerZipCode = c.Order.Customer.CustomerAddresses.First(n => n.StateName == StateNames.California).ZipCode,
CustomerName = c.Order.Customer.Name,
c.DateTimeApproved,
c.Status
})
.ToArray()
};
}
Это не важно для этого заказа/модель клиента, чтобы понять и улучшить его - это просто пример, так что мы получаем представление о том, почему мне нужно получить количество звонков NHibernate делает в БД.
Nice Я вижу, что статистика содержит stats.getQueryExecutionCount(); – ehuna