0

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

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

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

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

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

示例 - 假设我们有以下模型/数据库 -

客户客户地址订单订单状态订单详情

下面的代码对每个相关表的每个订单详细信息进行一次选择调用,等等...数据库中只有 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 对数据库的调用次数。

4

2 回答 2

0

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

使用 log4net 记录 NHibernate

于 2011-10-05T20:18:14.627 回答
0

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

JavaLobby 的这篇文章提供了一些细节。

于 2011-10-05T20:31:07.337 回答