Spring多数据源导致配置失效的解决
作者:droidcoffee-
这篇文章主要介绍了Spring多数据源导致配置失效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
spring多数据源导致配置失效
<!-- 切换数据源 --> <bean id="dataSourceAdvice" class="com.xxxx.app.datasource.DataSourceAdvice" /> <!-- 配置事务切面 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.xxxx..*.*(..))" /> <aop:advisor pointcut-ref="serviceOperation" advice-ref="dataSourceAdvice" /> </aop:config>
如果在springApplication.xml中配置的, 那么expression配置的相关的 包,必须在springmvc.xml中被扫描到
<context:component-scan base-package="com.xxxx.xxxxxx" />
如果不配置的话 会导致失败
spring配置多数据源问题,如何彼此隔离互相不影响
配置2个数据源,事物切面配置:“事物添加方法前缀”配置相同并且“事物的切入点”如下配置,如果其中任何一个数据源连接不上事物提交不了,数据保存不成功
事物添加方法前缀:
- 第一个:方法前缀:save
<tx:advice id="shardTxAdvice" transaction-manager="shardTransactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> .......... .......... </tx:attributes> </tx:advice>
- 第二个:方法前缀:save
<tx:advice id="qualTxAdvice" transaction-manager="qualTransactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> ......... ......... </tx:attributes> </tx:advice>
事物的切入点:
<aop:config> <aop:pointcut id="bizMethods" expression="execution(* com.cn.*.service.*.*(..)) or execution(* com.cn.*.*.service.*.*(..)) or execution(* com.cn.*.*.*.*(..))" /> <aop:advisor advice-ref="shardTxAdvice" pointcut-ref="bizMethods" /> <aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bizMethods" /> </aop:config>
方案一
如果确定了,其中一个数据源只查询使用没有数据维护,不为其配置事物。
方案二
如果2数据源都需要对数据维护,同时保证2个数据源的事物对所有的服务层一致,可以将2个数据源的事物添加方法前缀配置的不一样.
这种情况下,试验中证明:
1:单独操作其中一数据源的方法开启事物,其他数据源连接失败也不相互影响,
2:操作2个数据源的方法,其中任何一个数据连接失败,事物仍然会回滚。
事物添加方法前缀:
- 第一个:方法前缀:save
<tx:advice id="shardTxAdvice" transaction-manager="shardTransactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> .......... .......... </tx:attributes> </tx:advice>
- 第二个:方法前缀:qual_save
<tx:advice id="qualTxAdvice" transaction-manager="qualTransactionManager"> <tx:attributes> <tx:method name="qual_save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> ......... ......... </tx:attributes> </tx:advice>
事物的切入点:
不变,保证2个数据源事物对“所有的服务层一致”
<aop:config> <aop:pointcut id="bizMethods" expression="execution(* com.cn.*.service.*.*(..)) or execution(* com.cn.*.*.service.*.*(..)) or execution(* com.cn.*.*.*.*(..))" /> <aop:advisor advice-ref="shardTxAdvice" pointcut-ref="bizMethods" /> <aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bizMethods" /> </aop:config>
方案三
事物添加方法前缀相同,修改不同事物的切入点
Spring的AOP应该是可以把不同的事物,插入到不同的类和方法中。
<!-- 事务范围aop--> 指定包下某个类的方法使用新的数据源事物 <aop:config> <aop:pointcut id="bigbizMethods" expression="execution(* com.cn.sp.sc.service..CouponBigDataService.*(..))" /> <aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bigbizMethods" /> </aop:config>
也许有更好的方案解决,我实验是这3种情况下的方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。