Thank you for getting back to me on this.
As per your suggestion, I have the original code snippets moved to this
location - http://pastebin.com/Fzp7zs3k
Here are the requested details.
1.Are these the same GetUnitOfWork() method? - <JR>Yes.
2.Where is currentSessionUOW? - <JR>This is a private UnitofWork object in
the BL(Biz Layer). This holds the session from the above GetUnitOfWork.
3.Where is sessionHash? -
<JR> sessionHash is a Private hashtable in our GenricNHibernateRepository
which hold the hashcode of a new nH session created from the below
"ProcessSession".
Public abstract class GenericNHibernateRepository<T, IdT> :
IGenericRepository<T, IdT>
{
private ISession session = null;
private Type persistentType = typeof(T);
private UnitOfWork persistentUnitOfWork = null;
private Hashtable sessionHash = new Hashtable();
/// <summary>
/// GenericNHibernateRepository.
/// </summary>
/// <param name="nHibernateUnitOfWork">NHibernateUnitOfWork</param>
protected GenericNHibernateRepository(UnitOfWork
nHibernateUnitOfWork)
{
ProcessSession(nHibernateUnitOfWork);
}
/// <summary>
/// ProcessSession.
/// </summary>
/// <param name="nHibernateUnitOfWork">NHibernateUnitOfWork</param>
public void ProcessSession(UnitOfWork nHibernateUnitOfWork)
{
if (nHibernateUnitOfWork != null)
{
if (sessionHash[nHibernateUnitOfWork.Session.GetHashCode()]
!= null)
{
nHibernateUnitOfWork =
(UnitOfWork)sessionHash[nHibernateUnitOfWork.Session.GetHashCode()];
}
}
if (nHibernateUnitOfWork == null)
{
FluentnHibernateHelper.Mapper = persistentType;
Logger.WriteTraceStart(MethodBase.GetCurrentMethod(),
"Creating new Unit of Work");
nHibernateUnitOfWork = new
UnitOfWork(FluentnHibernateHelper.SessionFactory);
}
sessionHash.Add(nHibernateUnitOfWork.Session.GetHashCode(),
nHibernateUnitOfWork);
session = nHibernateUnitOfWork.Session;
}
...................................
.....................................
}
4. Are you firing up multiple SessionFactories (and
FluentNHibernateHelpers)? ie; more than one per instance of the worker
process?
<JR> We are not doing it explicitly from the code. But as part of couple of
recent tests, I suspect that multiple Session Factories were created,while
calling from concurrent threads. Could this be because that Session factory
creation is not a thread safe operation?
Here is the code that we have for the session factory creation.
public UnitOfWork(ISessionFactory sessionFactory)
{
session = sessionFactory;
Session = session.OpenSession();
Session.FlushMode = FlushMode.Auto;
if (Session.Transaction.IsActive)
{
transaction = Session.Transaction;
}
else
{
transaction =
Session.BeginTransaction(IsolationLevel.Unspecified);
}
}
.........................
FluentNHibernateHelper:
public static class FluentnHibernateHelper
{
#region Page Level Constants
private const string message = "Connection String Decryption
Failed";
private static ISessionFactory sessionFactory = null;
private static string connection = string.Empty;
#endregion
public static ISessionFactory SessionFactory
{
get { return sessionFactory ?? (sessionFactory =
CreateSessionFactory()); }
}
..............
private static ISessionFactory CreateSessionFactory()
{
NHibernate.Cfg.Configuration connection =
Fluently.Configure().Database
(OracleDataClientConfiguration.Oracle10.ConnectionString(ConnectionString)
.UseReflectionOptimizer())
.Mappings(m =>
{
m.FluentMappings.Add<Map1>();
m.FluentMappings.Add<Map2>();
...............
}).BuildConfiguration();
return connection.BuildSessionFactory();
}
public static ISession OpenSession()
{
if (SessionFactory.GetCurrentSession().IsOpen)
SessionFactory.GetCurrentSession().Close();
return SessionFactory.OpenSession();
}
}
}
Thanks,
JR.
On Friday, September 28, 2012 6:46:19 AM UTC-7, fel0nious wrote:
>
>
> *
>
> public void DisposeCurrentUow()
> {
> GetUnitOfWork();
> daoFactory.Dispose(currentSessionUOW);
> }*
> *
> *
> * public UnitOfWork GetUnitOfWork
> {
> get { return (UnitOfWork)sessionHash[GetSession.GetHashCode()];
> }
> }*
>
> Are these the same GetUnitOfWork() method?
> Where is currentSessionUOW?
>
> Where is sessionHash? Are you firing up multiple SessionFactories (and
> FluentNHibernateHelpers)? ie; more than one per instance of the worker
> process?
>
> It seems like you might be muddying the boundary between HTTP sessions,
> IIS worker process, NH SessionFactory, and NH Session. And that might be
> resulting in NH Sessions/Factories being orphaned in the sessionHash
> (assuming that's stored in the HTTP Session). You might be able to confirm
> this by lowering the Session Timeout in IIS from its default (20min) to,
> say, 1 min. Ultimately that wouldn't solve the problem, but might help
> point to where the problem exists.
>
> The SuppressFinalize also sticks out to me a bit. What prompted you to put
> this there? Was your factory showing up as disposed in new http sessions
> when you weren't expecting it to be? You shouldn't have to do this if
> you've architected it right, and aren't crossing those boundaries I mention
> above (for instance, storing an http session-agnostic object in each http
> session that makes a request, then subsequently disposing that object after
> each request).
>
> ----
> As for the word doc thing .. at least it wasn't .doc. I absolutely hate
> putting & seeing code in the group post/email because it seems to have an
> arbitrary fixed width and formatting is wrecked. The fact that .docx is an
> open format and respects the formatting is an added bonus. PasteBin is a
> good idea, but having everything I need in the email is convenient -
> especially in cases when my email is synced, but I don't have immediate
> access to data (which was the case for me when trying to help him and
> writing this up). Perhaps this is an 'official rule' of the group .. idk ..
> but it smells of an overzealous purist rant reminiscent of MS trolling,
> especially since you weren't helpful.. Personally, I think we're past that
> age of the internet.
>
> ------
> Joe Brockhaus
> [email protected] <javascript:>
> ------------
>
>
> On Fri, Sep 28, 2012 at 3:40 AM, Ramon Smits <[email protected]<javascript:>
> > wrote:
>
>>
>>>
>>> Please see the code snippets attached.
>>
>>
>> Please do not put code snippets in a word document. Better to just put
>> these in the email it self or put them in text attachments or on a website
>> like pastebin.com
>>
>> -- Ramon
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> To unsubscribe from this group, send email to
>> [email protected] <javascript:>.
>> For more options, visit this group at
>> http://groups.google.com/group/nhusers?hl=en.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/nhusers/-/NKSn5ihCYysJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.