NHibernate数据库调用计数?

时间:2011-10-05 20:06:56

标签: nhibernate nhibernate.search

有没有办法在运行时获得NHibernate对数据库进行的调用次数?

我知道我可以使用NHibernate探查器(NHProf,http://nhprof.com/)在调试时手动查看此计数 - 但我想要做的是在运行时获取实际数据库NHibernate的调用次数如果这是一个荒谬的数字,如50或300(确切的数字待定),我可以抛出异常。

这将向开发人员表明他/她需要使用'Eager'和'Future'并调整NHibernate代码,因此不会对数据库进行数百次调用。

下面我有一个例子,我看到对数据库进行了284次调用 -

我们可以修复这段代码 - 所以我不是在寻找如何更好地制作这个NHibernate代码的解决方案。我想改为实现一个系统,通知开发人员他们需要调整Nhibernate代码。

示例 - 假设我们有以下模型/ db -

客户 customeraddress 订购 orderstate 的OrderDetail

下面的代码对每个相关表等的每个订单详细信息进行一次选择调用...在数据库中只有72个订单详细信息,最终我们对数据库进行了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 :(得分:0)

您可以使用log4net收集该信息。

Logging NHibernate with log4net

答案 1 :(得分:0)

可以配置SessionFactory来收集统计信息。例如。成功交易的数量或已开设的会话数。

Article at JavaLobby提供了一些详细信息。