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

Reply via email to