Счетчик вызовов базы данных NHibernate? - PullRequest
0 голосов
/ 06 октября 2011

Есть ли способ узнать во время выполнения количество вызовов, которые NHibernate делает в базу данных?

Я знаю, что могу использовать профилировщик NHibernate (NHProf, http://nhprof.com/), чтобы вручную просмотреть этот счетчикво время отладки, но я хотел бы во время выполнения получить фактическое количество вызовов к базе данных, которые выполняет NHibernate, чтобы я мог выдать исключение, если это смешное число, например 50 или 300 (точное число должно быть определено).

Это будет указанием разработчику, что он / она должен использовать 'Eager' и 'Future' и настроить код NHibernate, чтобы сотни вызовов не выполнялись в базе данных.

Ниже у меня есть пример, где я вижу 284 вызова в базу данных -

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

Пример - предположим, у нас есть следующая модель / db -

customer customeraddress order orderstateDetail

Приведенный ниже код выполняет один вызов select для каждой детали заказа для каждой из связанных таблиц и т. Д. Имея только 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 делает в БД.

Ответы [ 2 ]

0 голосов
/ 06 октября 2011

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

В этой статье на JavaLobby приведены некоторые подробности.

0 голосов
/ 06 октября 2011

Вы можете использовать log4net для сбора этой информации.

Ведение журнала NHibernate с log4net

...