[ http://issues.apache.org/jira/browse/IBATISNET-102?page=all ]
     
Gilles Bayon closed IBATISNET-102:
----------------------------------

    Fix Version: DataAccess 1.7
     Resolution: Fixed
      Assign To: Gilles Bayon

In SVN

> Calling OpenConnection on a DaoManager in different threads causes an 
> Exception
> -------------------------------------------------------------------------------
>
>          Key: IBATISNET-102
>          URL: http://issues.apache.org/jira/browse/IBATISNET-102
>      Project: iBatis for .NET
>         Type: Bug
>   Components: DataAccess
>     Versions: DataAccess 1.6.0, DataAccess 1.6.1
>  Environment: windows xp sp2, .Net 1.1 sp1
>     Reporter: Louis Letourneau
>     Assignee: Gilles Bayon
>      Fix For: DataAccess 1.7

>
> Opening many (different)connections each in a seperate thread (as would occur 
> in a web application) for one instance of a DaoManager causes connection 
> already opened exceptions (or calling CloseConnection in the same 
> circumstances causes connection already closed exceptions) . It's as if the 
> new sessions don't get created individually for each thread...
> I took the liberty of checking the source code of the DataAccess component, 
> and the variable _localSqlMapSession in WindowSessionContainer.cs should be 
> static. If it's not the ThreadStatic attribute will have no effect and every 
> thread will have the same session (as in my case).
> (The java ThreadLocal object can be used on a non-static field. The 
> ThreadStatic attribute cannot. The compiler ignores the attribute on 
> non-static fields).
> Exception:
> Got: IBatisNet.DataAccess.Exceptions.DataAccessException: DaoManager could 
> not invoke OpenConnection(). A connection is already started. Call 
> CloseConnection first.
> I think that if you wish to have the same behaviour as the java dao 
> implementation (having multiple DaoManager instances that each have different 
> sessions per thread) adding the static modifier to the ThreadStatic field 
> will not fix the issue in WindowSessionContainer.cs.
> Instead of the static ThreadStatic field(which will be shared by every 
> WindowSessionContainer in a given thread), maybe a hashtable instance that 
> has the current daomanager name as key and the session as value would work.
> ie(WindowSessionContainer.cs) Replace:
> ------------------------------------------------
> [ThreadStatic] 
> private 'static' IDalSession _localSqlMapSession = null; // currently missing 
> the static modifier here
> public IDalSession LocalSession
> {
>       get
>       {
>               return _localSqlMapSession;
>       }
> }
> public void Store(IDalSession session)
> {
>       _localSqlMapSession = session;
> }
> ------------------------------------------------
> by
> ------------------------------------------------
> [ThreadStatic] 
> private static IDictionary _localSqlMapSessions; // can't initialize 
> ThreadStatic variables.
> private static Object _mutex = new Object();
> private string _daoManagerName;
> public WindowSessionContainer(string daoManagerName) {
>       lock(_mutex) {
>               if(_localSqlMapSessions == null)
>                       _localSqlMapSessions = new Hashtable();
>       }
>       _daoManagerName = daoManagerName;
> }
> public IDalSession LocalSession
> {
>       get
>       {
>               return _localSqlMapSessions[_daoManagerName];
>       }
> }
> public void Store(IDalSession session)
> {
>       _localSqlMapSessions[_daoManagerName] = session;
> }
> ------------------------------------------------
> This way, for a given thread, every WindowSessionContainer will share the 
> _localSqlMapSessions, but since there is one WindowSessionContainer per 
> DaoManager, the IDalSession will be unique by thread+DaoManager instance. And 
> as a bonus, when the thread dies, the resources will be cleaned up.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to