Spring多数据源配置系列(一)——多数据源配置

41 篇文章 0 订阅

来源:https://blog.csdn.net/luo4105/article/details/77720679

Spring多数据源

Spring中,可以通过AbstractRoutingDataSource来实现多数据源管理。这里步骤为

1. 在Spring注册多个数据源

2. 新建类继承AbstractRoutingDataSource,并配置

3. 给TheadLocal赋值

这种技术现在已经过时,现在大部分使用数据库代理。

Spring注册多个数据源

  1. <bean id="cmsDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  2. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  3. <property name="url" value="jdbc:mysql://localhost:3306/aicms" />
  4. <property name="username" value="root" />
  5. <property name="password" value="123456" />
  6. </bean>
  7. <bean id="epgDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  8. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  9. <property name="url" value="jdbc:mysql://localhost:3306/epgdb" />
  10. <property name="username" value="root" />
  11. <property name="password" value="123456" />
  12. </bean>

新建DynamicDataSource类继承AbstractRoutingDataSource,并配置

AbstractRoutingDataSource是spring的多数据源管理的抽象类,这里我们需要新建一个类继承它,并重写determineCurrentLookupKey方法,这个方法是多数据源的调用的逻辑部分,它返回一个多数据源的key,根据key找到对应的DataSource。在spring的配置DynamicDataSource时,需要指定targetDataSources,这就是目标数据源集,是一个map,key就是通过targetDataSources获得对应的数据源。这里我们使用TheadLocal是因为线程的安全。

  1. public class DynamicDataSource extends AbstractRoutingDataSource {
  2. public static ThreadLocal key = new ThreadLocal<String>();
  3. @Override
  4. protected Object determineCurrentLookupKey() {
  5. return key.get();
  6. }
  7. }

  1. <bean id="dynamicDataSource" class="com.lc.rout.DynamicDataSource">
  2. <property name="targetDataSources">
  3. <map>
  4. <entry key="cms" value-ref="cmsDataSource"/>
  5. <entry key="epg" value-ref="epgDataSource"/>
  6. </map>
  7. </property>
  8. </bean>

sqlSessionFactory的dataSource就是配置的dynamicDataSource

  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="dynamicDataSource" />
  3. <property name="mapperLocations" value="mapper/*.xml" />
  4. <property name="typeAliasesPackage" value="com.lc.model" />
  5. </bean>

给TheadLocal赋值

在Service层中,我们需要给key进行赋值,指定将使用的dataSource。实际就是在每个方法运行前给key赋值,在方法结束后移除赋值。

  1. public Column selectOne(int id) {
  2. DynamicDataSource.key.set( "cms");
  3. Column col =mapper.selectOne(id);
  4. DataSourceKey.key.remove();
  5. return col;
  6. }

当然,我们不可能像这样在每个方法前后加上赋值和移除复制的语句。这里可以用AOP实现,即自定义注解,注解参数是key。在service类上加上注解,调用service方法时,根据注解给key赋值。这里可以设置默认值,当service没有注解时,赋默认值。

这下面其实就是SpringAOP方面的知识了,便只放代码,不讲解了。

Spring配置开启AOP

<aop:aspectj-autoproxy proxy-target-class="true"/>

自定义注解

  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Target({ElementType.TYPE})
  4. public @interface DataSource {
  5. String value() default EPG;
  6. String CMS = "cms";
  7. String EPG = "epg";
  8. }

切面逻辑

  1. @Component
  2. @Aspect
  3. public class DataSourceAspect {
  4. @Pointcut( "execution(* com.lc.service.*.*(..))")
  5. public void aspect() {
  6. }
  7. @Before( "aspect()")
  8. public void before(JoinPoint jp) throws Throwable{
  9. Class<?> class1 = jp.getTarget().getClass();
  10. DataSource anno = class1.getAnnotation(DataSource.class);
  11. if(anno != null) {
  12. DynamicDataSource.key.set(anno.value());
  13. } else {
  14. String key = (String) DataSource.class.getMethod( "value").getDefaultValue();
  15. DynamicDataSource.key.set(key);
  16. }
  17. }
  18. @After( "execution(* com.lc.service.*Service.*(..))")
  19. public void after(JoinPoint jp) throws Throwable{
  20. DynamicDataSource.key.remove();
  21. }
  22. }

添加注解


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luo4105/article/details/77720679
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值