You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Jason Kratz <ja...@firm58.com> on 2008/08/01 23:01:56 UTC

strange issue with sqlmapsession

Hi all...

I'm using iBATIS with Spring and am having an odd issue that I'm not  
sure how to resolve.

We have an oracle DataSource where we have to set a client identifier  
which is used by the row-level security feature of oracle when we get  
connections from the datasource.  When we construct the sqlmapdao we  
call getSqlMapClientTemplate().getSqlMapClient().setUserConnection().   
In our Weblogic environment this works fine but we are having problems  
in a junit environment (using the same connection handling but with  
Spring's testing framework.  The problem is that when the oracle row- 
level security is enabled we aren't seeing any rows which means the  
client identifier isn't being set when running unit tests.

When we run a queryForList it ends up hitting the execute() method of  
the SqlMapClientTemplate from Spring.  The first thing that method  
does is call SqlMapSession session = this.sqlMapClient.openSession();  
and this seems to be the ultimate source of the problem.   Why?   
Because the localSqlMapSession that is stored in a ThreadLocal when we  
call sqlMapClient().setUserConnection() is never checked when  
sqlMapClient.openSession() is called.    
sqlMapClient.setUserConnection() first checks for a localSqlMapSession  
and creates one if one isn't already present.  But for some reason it  
seems that that localSqlMapSession is never actually used anywhere  
(unless I'm missing something but I was looking at the references of  
the objects themselves and nothing was matching what was originally  
created when I called setUserConnection() on the sqlMapClient the  
first time).  I seem to be getting a new connection to the database  
which doesn't have the oracle-specific client identifier stored and  
this means we get no data back.

Now....I'm not sure why this doesn't happen inside of our weblogic  
environment but the config for ibatis is a bit different.  In the  
sqlMapConfig for weblogic we are specifying a transactionManager type  
of EXTERNAL.  We aren't in the unit testing setup but I was under the  
impression that the spring defaulted to an EXTERNAL transactionManager  
anyhow when the sqlmapclientfactorybean builds sqlmapclient objects.

This is probably pretty confusing so I can clarify if need be ;) Also,  
this happens with both release 2.3.3 and 2.3.0.

Thanks,

Jason

strange issue with sqlmapsession

Posted by Jason Kratz <ja...@firm58.com>.
Sorry....reposting this in case it got lost in the shuffle over the  
weekend.  Really curious about this SqlMapSession issue.

Thanks,

Jason

On Aug 1, 2008, at 4:01 PM, Jason Kratz wrote:

> Hi all...
>
> I'm using iBATIS with Spring and am having an odd issue that I'm not  
> sure how to resolve.
>
> We have an oracle DataSource where we have to set a client  
> identifier which is used by the row-level security feature of oracle  
> when we get connections from the datasource.  When we construct the  
> sqlmapdao we call  
> getSqlMapClientTemplate().getSqlMapClient().setUserConnection().  In  
> our Weblogic environment this works fine but we are having problems  
> in a junit environment (using the same connection handling but with  
> Spring's testing framework.  The problem is that when the oracle row- 
> level security is enabled we aren't seeing any rows which means the  
> client identifier isn't being set when running unit tests.
>
> When we run a queryForList it ends up hitting the execute() method  
> of the SqlMapClientTemplate from Spring.  The first thing that  
> method does is call SqlMapSession session =  
> this.sqlMapClient.openSession(); and this seems to be the ultimate  
> source of the problem.   Why?  Because the localSqlMapSession that  
> is stored in a ThreadLocal when we call  
> sqlMapClient().setUserConnection() is never checked when  
> sqlMapClient.openSession() is called.    
> sqlMapClient.setUserConnection() first checks for a  
> localSqlMapSession and creates one if one isn't already present.   
> But for some reason it seems that that localSqlMapSession is never  
> actually used anywhere (unless I'm missing something but I was  
> looking at the references of the objects themselves and nothing was  
> matching what was originally created when I called  
> setUserConnection() on the sqlMapClient the first time).  I seem to  
> be getting a new connection to the database which doesn't have the  
> oracle-specific client identifier stored and this means we get no  
> data back.
>
> Now....I'm not sure why this doesn't happen inside of our weblogic  
> environment but the config for ibatis is a bit different.  In the  
> sqlMapConfig for weblogic we are specifying a transactionManager  
> type of EXTERNAL.  We aren't in the unit testing setup but I was  
> under the impression that the spring defaulted to an EXTERNAL  
> transactionManager anyhow when the sqlmapclientfactorybean builds  
> sqlmapclient objects.
>
> This is probably pretty confusing so I can clarify if need be ;)  
> Also, this happens with both release 2.3.3 and 2.3.0.
>
> Thanks,
>
> Jason