有没有办法在运行时获得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对数据库的调用次数。
答案 0 :(得分:0)
您可以使用log4net收集该信息。
答案 1 :(得分:0)
可以配置SessionFactory来收集统计信息。例如。成功交易的数量或已开设的会话数。
此Article at JavaLobby提供了一些详细信息。