java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring多数据源导致配置失效

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个数据源,事物切面配置:“事物添加方法前缀”配置相同并且“事物的切入点”如下配置,如果其中任何一个数据源连接不上事物提交不了,数据保存不成功

事物添加方法前缀:

<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>
<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个数据源的方法,其中任何一个数据连接失败,事物仍然会回滚。

事物添加方法前缀:

<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>
<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种情况下的方法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文