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