From: <aye...@us...> - 2009-06-22 05:26:56
|
Revision: 4508 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4508&view=rev Author: ayenderahien Date: 2009-06-22 05:26:50 +0000 (Mon, 22 Jun 2009) Log Message: ----------- Fixing NH-1844 - SessionIdLoggingContext causing perf problems Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionIdLoggingContext.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs Property Changed: ---------------- branches/2.1.x/nhibernate/src/Iesi.Collections.Test/ branches/2.1.x/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ branches/2.1.x/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ branches/2.1.x/nhibernate/src/NHibernate.ByteCode.Spring.Tests/ branches/2.1.x/nhibernate/src/NHibernate.Test/ Property changes on: branches/2.1.x/nhibernate/src/Iesi.Collections.Test ___________________________________________________________________ Modified: svn:ignore - bin obj AssemblyInfo.cs [Bb]in [Dd]ebug [Rr]elease *.user *.aps *.eto + bin obj AssemblyInfo.cs [Bb]in [Dd]ebug [Rr]elease *.user *.aps *.eto *.xml Modified: branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionIdLoggingContext.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionIdLoggingContext.cs 2009-06-22 05:00:35 UTC (rev 4507) +++ branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionIdLoggingContext.cs 2009-06-22 05:26:50 UTC (rev 4508) @@ -3,10 +3,16 @@ namespace NHibernate.Impl { + using System.Web; + public class SessionIdLoggingContext : IDisposable { - private readonly object oldSessonId; + [ThreadStatic] private static Guid? CurrentSessionId; + private const string CurrentSessionIdKey = "NHibernate.Impl.SessionIdLoggingContext.CurrentSessionId"; + + private readonly Guid? oldSessonId; + public SessionIdLoggingContext(Guid id) { oldSessonId = SessionId; @@ -18,28 +24,20 @@ /// this is usally the case if we are called from the finalizer, since this is something /// that we do only for logging, we ignore the error. /// </summary> - private static object SessionId + public static Guid? SessionId { get { - try - { - return ThreadContext.Properties["sessionId"]; - } - catch (Exception) - { - return null; - } + if (HttpContext.Current != null) + return (Guid?)HttpContext.Current.Items[CurrentSessionIdKey]; + return CurrentSessionId; } set { - try - { - ThreadContext.Properties["sessionId"] = value; - } - catch (Exception) - { - } + if (HttpContext.Current != null) + HttpContext.Current.Items[CurrentSessionIdKey] = value; + else + CurrentSessionId = value; } } Property changes on: branches/2.1.x/nhibernate/src/NHibernate.ByteCode.Castle.Tests ___________________________________________________________________ Modified: svn:ignore - obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* + obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* *.xml Property changes on: branches/2.1.x/nhibernate/src/NHibernate.ByteCode.LinFu.Tests ___________________________________________________________________ Modified: svn:ignore - obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* + obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* *.xml Property changes on: branches/2.1.x/nhibernate/src/NHibernate.ByteCode.Spring.Tests ___________________________________________________________________ Modified: svn:ignore - obj .#* *.user *.xsx *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* AssemblyInfo.cs hibernate.cfg.xml + obj .#* *.user *.xsx *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* AssemblyInfo.cs hibernate.cfg.xml *.xml Property changes on: branches/2.1.x/nhibernate/src/NHibernate.Test ___________________________________________________________________ Modified: svn:ignore - bin obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml Debug Release *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* + bin obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml Debug Release *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* *.xml Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs 2009-06-22 05:00:35 UTC (rev 4507) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs 2009-06-22 05:26:50 UTC (rev 4508) @@ -6,6 +6,15 @@ namespace NHibernate.Test.NHSpecificTest.Logs { + using System; + using System.IO; + using System.Text; + using log4net; + using log4net.Appender; + using log4net.Core; + using log4net.Layout; + using log4net.Repository.Hierarchy; + [TestFixture] public class LogsFixture : TestCase { @@ -22,16 +31,62 @@ [Test] public void WillGetSessionIdFromSessionLogs() { - using (var spy = new SqlLogSpy()) + ThreadContext.Properties["sessionId"] = new SessionIdCapturer(); + + using (var spy = new TextLogSpy("NHibernate.SQL", "%message | SessionId: %property{sessionId}")) using (var s = sessions.OpenSession()) { var sessionId = ((SessionImpl)s).SessionId; s.Get<Person>(1);//will execute some sql - var loggingEvent = spy.Appender.GetEvents()[0]; - Assert.AreEqual(sessionId, loggingEvent.Properties["sessionId"]); + var loggingEvent = spy.Events[0]; + Assert.True(loggingEvent.Contains(sessionId.ToString())); } } + + public class SessionIdCapturer + { + public override string ToString() + { + return SessionIdLoggingContext.SessionId.ToString(); + } + } + + public class TextLogSpy : IDisposable + { + private readonly TextWriterAppender appender; + private readonly Logger loggerImpl; + private readonly StringBuilder stringBuilder; + + public TextLogSpy(string loggerName, string pattern) + { + stringBuilder = new StringBuilder(); + appender = new TextWriterAppender + { + Layout = new PatternLayout(pattern), + Threshold = Level.All, + Writer = new StringWriter(stringBuilder) + }; + loggerImpl = (Logger)LogManager.GetLogger(loggerName).Logger; + loggerImpl.AddAppender(appender); + loggerImpl.Level = Level.All; + } + + public string[] Events + { + get + { + return stringBuilder.ToString().Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); + } + } + + public void Dispose() + { + loggerImpl.RemoveAppender(appender); + } + } } + + } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |