Hi,
we were recently looking for a way to do db profiling to identify expensive
operations in our application. We use NhProfiler internally but very often
you need the performance data in a productive system, also when having many
instances of your application it is convenient to have some sort of
Performanceoverview showing how much database load is caused by which
instance (so we can't NhProf for this).
Now Nhibernate comes with a very extensive performance profiler which gives
you nearls every detail you could possibly need but the statistcs impl has
some severe disadvantages:
- it is a global statistics thus requiring locking, ie you cannot enable it
on a productive system
- you cannot extend it or exchange it with your own implementation
I worked around the latter restriction by extending the session factory to
store two statistics members:
[NonSerialized]
private IStatistics statistics;
[NonSerialized]
private IStatisticsImplementor statisticsImpl;
And I added a public InitStatistics function:
public void InitStatistics(IStatistics stat, IStatisticsImplementor impl)
{
statistics = stat;
statisticsImpl = impl;
}
Initially those members are set to the default statistics impl:
private void Init()
{
var impl = new StatisticsImpl(this);
statistics = impl;
statisticsImpl = impl;
queryPlanCache = new QueryPlanCache(this);
}
IStatistics itself was extended with two properties:
- public TimeSpan TotalQueryExecutionTime { get; private set; }
- public long TotalRowsLoaded { get; private set; }
While this might work for us, I think that a proper solution should allow the
session statistics to be configured via the hibernate.cfg.xml file.
So having solved that, how to avoid the performance penalty associated with
global locking?
We are working in a Web Context and we want to identify the web requests that
consume the most Database time. We store for each request a performance entry
in the database (aggregated per page).
Those entries are then transferred to the performance center, the global
statistics for the application is then created by simple summing up all rows.
>From an implementation point of view we need two Session statistics classes to
>realise that:
- one decorator that gets another sessionStatistic from HttpContext
- a simpler version of the current SessionStatistics file without the lock
So,
any chance that this could be integrated in Nhibernate 4.0, at least the
configurable session statistics part?
--
---
You received this message because you are subscribed to the Google Groups
"nhibernate-development" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.