Bit*_*der 8 nhibernate log4net caching count nhprof
在代码的某些单元/集成测试中,我们希望检查我们的代码是否正在使用二级缓存.
根据Ayende提供的代码:
http://ayende.com/Blog/archive/2006/09/07/MeasuringNHibernatesQueriesPerPage.aspx
我写了一个简单的类来做到这一点:
public class QueryCounter : IDisposable
{
CountToContextItemsAppender _appender;
public int QueryCount
{
get { return _appender.Count; }
}
public void Dispose()
{
var logger = (Logger) LogManager.GetLogger("NHibernate.SQL").Logger;
logger.RemoveAppender(_appender);
}
public static QueryCounter Start()
{
var logger = (Logger) LogManager.GetLogger("NHibernate.SQL").Logger;
lock (logger)
{
foreach (IAppender existingAppender in logger.Appenders)
{
if (existingAppender is CountToContextItemsAppender)
{
var countAppender = (CountToContextItemsAppender) existingAppender;
countAppender.Reset();
return new QueryCounter {_appender = (CountToContextItemsAppender) existingAppender};
}
}
var newAppender = new CountToContextItemsAppender();
logger.AddAppender(newAppender);
logger.Level = Level.Debug;
logger.Additivity = false;
return new QueryCounter {_appender = newAppender};
}
}
public class CountToContextItemsAppender : IAppender
{
int _count;
public int Count
{
get { return _count; }
}
public void Close()
{
}
public void DoAppend(LoggingEvent loggingEvent)
{
if (string.Empty.Equals(loggingEvent.MessageObject)) return;
_count++;
}
public string Name { get; set; }
public void Reset()
{
_count = 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
预期用途:
using (var counter = QueryCounter.Start())
{
// ... do something
Assert.Equal(1, counter.QueryCount); // check the query count matches our expectations
}
Run Code Online (Sandbox Code Playgroud)
但它总是为查询计数返回0.没有记录sql语句.
但是,如果我使用Nhibernate Profiler并在我的测试用例中调用它:
NHibernateProfiler.Intialize()
Run Code Online (Sandbox Code Playgroud)
NHProf使用类似的方法从NHibernate捕获日志输出以通过log4net等进行分析,然后我的QueryCounter开始工作.
它看起来像我的思念在我的代码的东西得到log4net的用于记录NHibernate的SQL正确配置......没有任何人有上还有什么我需要做的,从NHibernate的获得SQL日志输出任何指针?
附加信息:
Logging.config:
<log4net>
<appender name="trace" type="log4net.Appender.TraceAppender, log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%P{user}&gt; - %m%n" />
</layout>
</appender>
<appender name="console" type="log4net.Appender.ConsoleAppender, log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%P{user}&gt; - %m%n" />
</layout>
</appender>
<appender name="debug" type="log4net.Appender.DebugAppender, log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%P{user}&gt; - %m%n" />
</layout>
</appender>
<logger name="NHibernate.SQL" additivity="false">
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</logger>
<root>
<priority value="DEBUG" />
<appender-ref ref="trace" />
<appender-ref ref="console" />
<appender-ref ref="debug" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
show_sql:true
基于jfneis响应,我写了一个更简单的类,它只使用NHibernate的工厂统计信息:
public class QueryCounter
{
long _startCount;
QueryCounter()
{
}
public int QueryCount
{
get { return (int) (UnitOfWork.CurrentSession.SessionFactory.Statistics.QueryExecutionCount - _startCount); }
}
public static QueryCounter Start()
{
return new QueryCounter {_startCount = UnitOfWork.CurrentSession.SessionFactory.Statistics.QueryExecutionCount};
}
}
Run Code Online (Sandbox Code Playgroud)
一旦启用统计信息,哪个工作正常.
jfn*_*eis 13
还有另一种(更简单的,IMO)方式来断言是否正在命中缓存或者正在执行查询:使用统计信息.
首先,您必须在NH配置文件中启用统计信息:
<property name="generate_statistics">true</property>
Run Code Online (Sandbox Code Playgroud)
之后,您可以随时询问您的会话工厂.你已经谈到了L2缓存测试,所以你可以有类似的东西:
// act
MappedEntity retrievedEntity = session.FindById(entity.Id);
long preCacheCount = sessionFactory.Statistics.SecondLevelCacheHitCount;
retrievedEntity = session.FindById(entity.Id);
long postCacheCount = sessionFactory.Statistics.SecondLevelCacheHitCount;
// assert
Assert.AreEqual(preCacheCount + 1, postCacheCount);
Run Code Online (Sandbox Code Playgroud)
但是,如果您真正想要的是查询计数,那么Statistics界面中还有很多其他选项:
sessionFactory.Statistics.QueryExecutionCount;
sessionFactory.Statistics.TransactionCount;
Run Code Online (Sandbox Code Playgroud)
嗯,就是这样.希望这可以帮助你帮助我.
问候,
菲利佩
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |