From: <aye...@us...> - 2010-04-22 22:25:27
|
Revision: 4972 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4972&view=rev Author: ayenderahien Date: 2010-04-22 22:25:21 +0000 (Thu, 22 Apr 2010) Log Message: ----------- Applying patch for NH-2131 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Model.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/PerfTest.cs trunk/nhibernate/src/NHibernate.TestDatabaseSetup/Properties/ Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2010-04-13 18:10:31 UTC (rev 4971) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2010-04-22 22:25:21 UTC (rev 4972) @@ -186,12 +186,9 @@ protected internal virtual void CheckAndUpdateSessionStatus() { - using (new SessionIdLoggingContext(SessionId)) - { - ErrorIfClosed(); - EnlistInAmbientTransactionIfNeeded(); - } - } + ErrorIfClosed(); + EnlistInAmbientTransactionIfNeeded(); + } protected internal virtual void ErrorIfClosed() { @@ -335,10 +332,7 @@ protected void EnlistInAmbientTransactionIfNeeded() { - using (new SessionIdLoggingContext(SessionId)) - { - factory.TransactionFactory.EnlistInDistributedTransactionIfNeeded(this); - } + factory.TransactionFactory.EnlistInDistributedTransactionIfNeeded(this); } } } Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2010-04-13 18:10:31 UTC (rev 4971) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2010-04-22 22:25:21 UTC (rev 4972) @@ -7,6 +7,7 @@ using NHibernate.Engine; using NHibernate.Engine.Transaction; using NHibernate.Exceptions; +using NHibernate.Impl; namespace NHibernate.Transaction { @@ -64,30 +65,34 @@ } catch (Exception t) { - try - { - if (trans != null && connection.State != ConnectionState.Closed) - { - trans.Rollback(); - } - } - catch (Exception ignore) - { - isolaterLog.Debug("unable to release connection on exception [" + ignore + "]"); - } + using (new SessionIdLoggingContext(session.SessionId)) + { + try + { + if (trans != null && connection.State != ConnectionState.Closed) + { + trans.Rollback(); + } + } + catch (Exception ignore) + { + isolaterLog.Debug("unable to release connection on exception [" + ignore + "]"); + } - if (t is HibernateException) - { - throw; - } - else if (t is DbException) - { - throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t, "error performing isolated work"); - } - else - { - throw new HibernateException("error performing isolated work", t); - } + if (t is HibernateException) + { + throw; + } + else if (t is DbException) + { + throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t, + "error performing isolated work"); + } + else + { + throw new HibernateException("error performing isolated work", t); + } + } } finally { Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2010-04-13 18:10:31 UTC (rev 4971) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2010-04-22 22:25:21 UTC (rev 4972) @@ -26,34 +26,42 @@ public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { - if (session.TransactionContext != null) - return; - if (System.Transactions.Transaction.Current == null) - return; - var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); - session.TransactionContext = transactionContext; - logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); - session.AfterTransactionBegin(null); - transactionContext.AmbientTransation.TransactionCompleted += delegate(object sender, TransactionEventArgs e) - { - bool wasSuccessful = false; - try - { - wasSuccessful = e.Transaction.TransactionInformation.Status - == TransactionStatus.Committed; - } - catch (ObjectDisposedException ode) - { - logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); - } - session.AfterTransactionCompletion(wasSuccessful, null); - if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) - { - session.CloseSessionFromDistributedTransaction(); - } - session.TransactionContext = null; - }; - transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); + if (session.TransactionContext != null) + return; + if (System.Transactions.Transaction.Current == null) + return; + var transactionContext = new DistributedTransactionContext(session, + System.Transactions.Transaction.Current); + session.TransactionContext = transactionContext; + logger.DebugFormat("enlisted into DTC transaction: {0}", + transactionContext.AmbientTransation.IsolationLevel); + session.AfterTransactionBegin(null); + transactionContext.AmbientTransation.TransactionCompleted += + delegate(object sender, TransactionEventArgs e) + { + using (new SessionIdLoggingContext(session.SessionId)) + { + bool wasSuccessful = false; + try + { + wasSuccessful = e.Transaction.TransactionInformation.Status + == TransactionStatus.Committed; + } + catch (ObjectDisposedException ode) + { + logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); + } + session.AfterTransactionCompletion(wasSuccessful, null); + if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) + { + session.CloseSessionFromDistributedTransaction(); + } + session.TransactionContext = null; + } + }; + transactionContext.AmbientTransation.EnlistVolatile(transactionContext, + EnlistmentOptions.EnlistDuringPrepareRequired); + } public bool IsInDistributedActiveTransaction(ISessionImplementor session) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Mappings.hbm.xml 2010-04-22 22:25:21 UTC (rev 4972) @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.SessionIdLoggingContextTest" + assembly="NHibernate.Test"> + + <class name="ClassA"> + <id name="Id"> + <generator class="guid.comb"/> + </id> + <property name="Name"/> + <bag name="Children" cascade="all-delete-orphan"> + <key column="Parent" /> + <one-to-many class="ClassA"/> + </bag> + + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/Model.cs 2010-04-22 22:25:21 UTC (rev 4972) @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.SessionIdLoggingContextTest +{ + public class ClassA + { + public virtual Guid Id { get; set; } + public virtual IList<ClassA> Children { get; set; } + public virtual string Name { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/PerfTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/PerfTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SessionIdLoggingContextTest/PerfTest.cs 2010-04-22 22:25:21 UTC (rev 4972) @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using NHibernate.Criterion; +using NHibernate.Transform; +using NUnit.Framework; +using NHibernate.Transaction; + +namespace NHibernate.Test.NHSpecificTest.SessionIdLoggingContextTest +{ + [TestFixture] + public class PerfTest : BugTestCase + { + const int noOfParents = 1000; + const int noOfChildrenForEachParent = 20; + + [Test] + public void Benchmark() + { + using(var s= OpenSession()) + { + var ticksAtStart = DateTime.Now.Ticks; + var res = s.CreateCriteria<ClassA>() + .SetFetchMode("Children", FetchMode.Join) + .SetResultTransformer(Transformers.DistinctRootEntity) + .Add(Restrictions.Eq("Name", "Parent")) + .List<ClassA>(); + Console.WriteLine(TimeSpan.FromTicks(DateTime.Now.Ticks-ticksAtStart)); + Assert.AreEqual(noOfParents, res.Count); + Assert.AreEqual(noOfChildrenForEachParent, res[0].Children.Count); + } + } + + protected override void Configure(Cfg.Configuration configuration) + { + //get rid of the overhead supporting distr trans + configuration.SetProperty(Cfg.Environment.TransactionStrategy, typeof(AdoNetTransactionFactory).FullName); + } + + protected override void OnSetUp() + { + using (var s = OpenSession()) + { + using (var tx = s.BeginTransaction()) + { + for (var i = 0; i < noOfParents; i++) + { + var parent = createEntity("Parent"); + for (var j = 0; j < noOfChildrenForEachParent; j++) + { + var child = createEntity("Child"); + parent.Children.Add(child); + } + s.Save(parent); + } + tx.Commit(); + } + } + } + + protected override void OnTearDown() + { + using(var s = OpenSession()) + { + using(var tx = s.BeginTransaction()) + { + s.CreateQuery("delete from ClassA").ExecuteUpdate(); + tx.Commit(); + } + } + } + + private static ClassA createEntity(string name) + { + var obj = new ClassA + { + Children = new List<ClassA>(), + Name = name + }; + return obj; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-04-13 18:10:31 UTC (rev 4971) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-04-22 22:25:21 UTC (rev 4972) @@ -1291,6 +1291,8 @@ <Compile Include="NHSpecificTest\ProxyValidator\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1362\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1362\Model.cs" /> + <Compile Include="NHSpecificTest\SessionIdLoggingContextTest\Model.cs" /> + <Compile Include="NHSpecificTest\SessionIdLoggingContextTest\PerfTest.cs" /> <Compile Include="NHSpecificTest\SetFixture.cs" /> <Compile Include="NHSpecificTest\SimpleComponentFixture.cs" /> <Compile Include="NHSpecificTest\UnsavedValueFixture.cs" /> @@ -2129,8 +2131,9 @@ <EmbeddedResource Include="CfgTest\Loquacious\EntityToCache.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> - <EmbeddedResource Include="ListIndex\SimpleOneToMany.hbm.xml" /> - <EmbeddedResource Include="NHSpecificTest\NH2113\Mappings.hbm.xml" /> + <EmbeddedResource Include="ListIndex\SimpleOneToMany.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\SessionIdLoggingContextTest\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2113\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1981\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2074\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2077\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |