2011-10-05 5 views
0

Есть ли способ получить во время выполнения количество вызовов, которые 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 делает в БД.

ответ

0

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

Article at JavaLobby дает некоторые сведения.

+0

Nice Я вижу, что статистика содержит stats.getQueryExecutionCount(); – ehuna