Hello, I switched to the Spring 2.0 AOP stuff a while back, so I have something like this for each DataSource (mine are on a per-vendor basis):
<bean id="vendorOneTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="vendorOneDataSource"/> </bean> <aop:config> <aop:pointcut id="vendorOneNontologyManagerOperation" expression="execution(* com.localmatters.bo.core.nontology.manager.*Manager.*(..))"/> <aop:pointcut id="vendorOneNontologyDAOOperation" expression="execution(* com.localmatters.bo.core.nontology.dao.ibatis.*DAO.*(..))"/> <aop:advisor advice-ref="vendorOneTxAdvice" pointcut-ref="vendorOneNontologyManagerOperation"/> <aop:advisor advice-ref="vendorOneTxAdvice" pointcut-ref="vendorOneNontologyDAOOperation"/> </aop:config> <!-- the transactional advice --> <tx:advice id="vendorOneTxAdvice" transaction-manager="vendorOneTransactionManager"> <tx:attributes> <!-- all methods starting with 'get' or 'select' are read-only --> <tx:method name="get*" read-only="true"/> <tx:method name="select*" read-only="true"/> <!-- other methods use the default transaction settings --> <tx:method name="*"/> </tx:attributes> </tx:advice> All methods on the Manager and DAO classes that do not start with get or select are then wrapped in their own transaction. I don't know how you'd do it for the old Spring style. Maybe you'd have multiple TransactionProxyFactoryBean beans that all target the same service? Cheers, Chris On Tue, 2007-05-22 at 18:30 +0200, tran duc trung wrote: > Hi, > > So how do you set a tx mrg for a service. Normally, i have a service > configured like this : > <bean id ="someService" > class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean > "> > <property name="target" ref="targetService"/> > <property name="transactionManager" ref="txManager"/> > <property name="transactionAttributes"> > ... > </property> > </bean> > > should i have a service for each tx mrg ? > > Thanks in advance! > > Trung > > 2007/5/22, Chris Lamey <[EMAIL PROTECTED]>: > Hello, > > I have a DataSource txn mgr for each DataSource. > > Cheers, > Chris > > On Tue, 2007-05-22 at 17:31 +0200, tran duc trung wrote: > > Thanks for the rapid response. > > > > How do you specify a DataSource for > DataSourceTransactionManager while > > you have several datasources (one for each SqlMapClient) ? > > > > Trung > > > > 2007/5/22, Chris Lamey < [EMAIL PROTECTED]>: > > Hello, > > > > I also use Spring's DataSource txn mgr with this > setup (in > > fact, I think > > the Spring SqlMapClient can't use the iBATIS txn > mgr). > > > > My transactions are contained in a single Thread > hitting a > > single > > DataSource within an invocation of a method of my > API. A > > Thread will > > likely end up hitting multiple DataSources over > time, but that > > ThreadLocal variable will be set upon entry into any > API > > method for the > > life of that method. > > > > The Spring DataSource txn mgr essentially watches > Threads > > hitting > > DataSources, it really doesn't care how they come > in. There > > is no > > difference to the txn mgr between calls from a > normal > > SqlMapClient and > > the RoutableSqlMapClient. They're just method calls > coming > > into the > > DataSource on a per-Thread basis. Spring basically > opens a > > transaction > > upon a Thread's entry into my API (more or less), > the txn mgr > > then > > batches up all the SQL generated, and when the > Thread leaves > > the API the > > txn mgr commits it all. > > > > Cheers, > > Chris > > > > On Tue, 2007-05-22 at 14:12 +0200, tran duc trung > wrote: > > > I have not yet tested your solution, but how about > the > > integration > > > with Spring Transaction Manager? > > > We do not have IbatisTransactionManager in Spring > but have > > to use > > > DataSourceTransactionManager which is not notified > when > > datasource > > > change. > > > > > > 2007/4/13, Chris Lamey <[EMAIL PROTECTED]>: > > > Yea, Spring has a new > AbstractRoutingDataSource that > > can route > > > to a > > > different datasource based on a > ThreadLocal. The > > problem is > > > that the > > > iBATIS SqlMapClient doesn't know the > datasource > > isn't the same > > > between > > > calls, so your caching gets horked. > > > > > > Based on the AbstractRoutingDataSource > idea, I wrote > > a > > > RoutingSqlMapClient that implements the > > ExtendedSqlMapClient > > > interface > > > and gets wired up in Spring like this: > > > > > > <bean id="sqlMapClient" > > > > > > class="com.localmatters.bo.core.util.RoutingSqlMapClient"> > > > <property name="targetSqlMapClients"> > > > <map > > > key-type=" > > com.localmatters.bo.core.commons.VendorTypes "> > > > <entry key="VendorOne" > > > value-ref="vendorOneSqlMapClient"/> > > > <entry key="VendorTwo" > > > value-ref="vendorTwoSqlMapClient"/> > > > <entry key="VendorThree" > > > value-ref="vendorThreeSqlMapClient"/> > > > </map> > > > </property> > > > </bean> > > > > > > Each of the "vendorXXXSqlMapClient" beans > has its > > own > > > datasource and > > > transaction handling. The "sqlMapClient" > bean is > > then set on > > > all my > > > DAOs. > > > > > > Then have a class, VendorContextHolder, > that sets a > > > ThreadLocal > > > variable that is then used by the > > RoutableSqlMapClient as a > > > key in the > > > targetSqlMapClients Map. My entry points > into the > > API then > > > use a method > > > parameter to set the ThreadLocal for the > that thread > > for the > > > remainder > > > of the call. > > > > > > It's working well so far, everything works > as > > > expected. Transactions > > > are handled correctly and there's been no > thread > > stomping. > > > > > > I don't know if it'll work for you because > your > > datasources > > > have to be > > > known in advance and it sounds like yours > may not > > be. > > > > > > Cheers, > > > Chris > > > > > > On Fri, 2007-04-13 at 12:34 -0600, Larry > Meadors > > wrote: > > > > You could implement a custom datasource > and > > datasource > > > factory to > > > > switch it on the fly, but I think you'd > have > > troubles with > > > things like > > > > caching, etc. > > > > > > > > A safer implementation would have two > sql map > > clients - one > > > per > > > > datasource that you swapped instead. > > > > > > > > Larry > > > > > > > > > > > > On 4/13/07, Paul Sanders > <[EMAIL PROTECTED]> > > wrote: > > > > > > > > > > One of the characteristics of my > application is > > that the > > > datasource > > > > > connection information can be supplied > by the > > user, and I > > > wonder if anyone > > > > > has any advice on how to handle that? > > > > > > > > > > Currently I define a datasource in my > > applicationcontext > > > with default > > > > > information (my test db) and specify > my > > BanPolicyDAO > > > object, letting Spring > > > > > inject the datasource. All works well > with my > > new > > > BanPolicy configuration > > > > > (that you've all seen over and over > this > > week!). > > > > > > > > > > I searched the archives for dealing > with > > multiple > > > datasources but all the > > > > > responses seemed to be in the case > when you knew > > the > > > connection info in > > > > > advance. In my case I need to create a > new > > datasource on > > > the fly, or be able > > > > > to change the settings of the existing > one. So > > far my > > > efforts haven't worked > > > > > - the DAO only ever uses the original > connection > > info. > > > > > > > > > > Anyone tried this, or have have any > thoughts on > > the best > > > way to do it? > > > > > > > > > > Cheers > > > > > > > > > > Paul > > > > > -- > > > > > View this message in context: > > > > > > > http://www.nabble.com/How-can-I-change-datasource-connect-info-on-the-fly-w-iBATIS-and-Spring--tf3573169.html#a9983995 > > > > > Sent from the iBATIS - User - Java > mailing list > > archive at > > > Nabble.com. > > > > > > > > > > > > > > > > > > >