|
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.
|