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.
> > > > >
> > > > >
> > >
> > >
> >
>