[ 
https://issues.apache.org/jira/browse/IBATISNET-291?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12734668#action_12734668
 ] 

Michael Fulker commented on IBATISNET-291:
------------------------------------------

I'm getting the exception when I enable caching.
I suspect it's the same issue: cache hits prevent the connection from being 
used and therefore prevents Dispose() from being called properly.

> SqlMapper.OpenConnection() does not actually open connection
> ------------------------------------------------------------
>
>                 Key: IBATISNET-291
>                 URL: https://issues.apache.org/jira/browse/IBATISNET-291
>             Project: iBatis for .NET
>          Issue Type: Bug
>          Components: DataMapper
>    Affects Versions: DataMapper 1.6.1
>            Reporter: Jonas Hamnered
>
> The second sqlMap.OpenConnection() in the following sample causes an 
> exception for DataMapper 1.6.1.
>         ISqlMapper sqlMap = Mapper.Get();
>         using (IDalSession session = sqlMap.OpenConnection())
>         {
>                 // session for some reason never used, could be due to logic 
> in called methods
>         }
>         using (IDalSession session = sqlMap.OpenConnection())
>         {
>         }
> The exception is:
> IBatisNet.DataMapper.Exceptions.DataMapperException: SqlMap could not invoke 
> OpenConnection(). A connection is already started. Call CloseConnection first.
>    at IBatisNet.DataMapper.SqlMapper.OpenConnection() in 
> C:\Devel\lib\iBatis\IBatisNet.DataMapper\SqlMapper.cs:line 204
> The reason is as far as I can tell that sqlMap.OpenConnection no longer opens 
> the underlying connection. Instead this is done "on demand". 
> The problem is that if the session is never used before being disposed, 
> SqlMapSession.Dispose() does not properly cause the 
> SqlMapper._sessionStore.Dispose() to be called:
> [from IBatisNet.DataMapper.SqlMapSession.Dispose()]
>         if (_isTransactionOpen == false)
>         {
>                 if (_connection.State != ConnectionState.Closed)
>                 {
>                         _sqlMapper.CloseConnection();
>                 }
>         }
> This finally causes the second sqlMap.OpenConnection() call to throw an 
> exception since the 
> [from IBatisNet.DataMapper.SqlMapper]
>         public ISqlMapSession OpenConnection() 
>         {
>                 if (_sessionStore.LocalSession != null) 
>                 {
>                         throw new DataMapperException("SqlMap could not 
> invoke OpenConnection(). A connection is already started. Call 
> CloseConnection first.");
>                 }
>                 ...
> A possible work-around is to manually call session.OpenConnection() inside 
> the using block.
> Possible fixes could obviously be:
> * to make sqlMap.OpenConnection always open the db connection (like in 
> earlier versions, and as the name says)
> * alter SqlMapSession.Dispose() to somehow cause a 
> SqlMapper._sessionStore.Dispose() even if the connection is closed

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@ibatis.apache.org
For additional commands, e-mail: dev-h...@ibatis.apache.org

Reply via email to