[ 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