Spring多数据源配置(干货)

1.配置多数据源连接信息(jdbc.properties)

  • jdbc.properties
# oracle 连接信息
jdbc.oracle.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.oracle.url=jdbc:oracle:thin:@127.0.0.1:6694/{database}
jdbc.oracle.username={userName}
jdbc.oracle.password={passwork}
# mysql 连接信息
jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/{database}
jdbc.mysql.username={userName}
jdbc.mysql.password={passwork}

2.配置xml文件(springmvc.xml)

#oracle
<bean id="oracleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
          destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
</bean>
#mysql
<bean id="mysqlDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.mysql.driver}"/>
        <property name="url" value="${jdbc.mysql.url}"/>
        <property name="username" value="${jdbc.mysql.username}"/>
        <property name="password" value="${jdbc.mysql.password}"/>
</bean>
#自定义动态数据源实体配置
<bean id="dataSource" class="cn.xdf.amoy.datasource.DynamicDataSource"><!--注意: 这里写选择数据源的类地址 下面跟着给出-->
        <property name="defaultTargetDataSource" ref="oracleDataSource"/><!-- 设置默认为此mySqlDataSource数据源-->
        <property name="targetDataSources">
            <map>
                <entry key="oracleDataSource" value-ref="oracleDataSource"/>
                <entry key="mysqlDataSource" value-ref="mysqlDataSource"/>
            </map>
        </property>
    </bean>

3.创建动态数据源配置类

package cn.cxqnet.datasource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
 * @author MyIreland
 * @description 动态数据源实体
 * @date 2018/10/19
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    public static final String ORACLE_DATASOURCE = "oracleDataSource";

    public static final String MY_SQL_DATASOURCE = "mysqlDataSource";

    //本地线程,获取当前正在执行的currentThread
    public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    public static void setCurrentDatasource(String dataSourceType){
        contextHolder.set(dataSourceType);
    }

    public static String getCurrentDatasource(){
        return contextHolder.get();
    }

    public static void clearCurrentDatasource(){
        contextHolder.remove();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return getCurrentDatasource();
    }
}

4.创建数据源注解

package cn.cxqnet.datasource.annotation;

import java.lang.annotation.*;

/**
 * @author MyIreland
 * @description 动态数据源注解
 * @date 2018/10/19
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
    String value() default "";
}

5.创建动态数据源切面(注解方式)

package cn.cxqnet.datasource.aspect;

import cn.cxqnet.datasource.DynamicDataSource;
import cn.cxqnet.datasource.annotation.DataSource;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
 * @author MyIreland
 * @description 动态数据源切面
 * @date 2018/10/19
 */
@Aspect
@Component
public class DataSourceAspect {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    @Pointcut("@annotation(cn.xdf.amoy.datasource.annotation.DataSource)")
    public void dataSourcePointCut() {
    }
    @Around("dataSourcePointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        DataSource ds = method.getAnnotation(DataSource.class);
        if(ds == null){
            DynamicDataSource.setCurrentDatasource(DynamicDataSource.ORACLE_DATASOURCE);
            logger.debug("set datasource is {}", DynamicDataSource.ORACLE_DATASOURCE);
        }else {
            DynamicDataSource.setCurrentDatasource(DynamicDataSource.MY_SQL_DATASOURCE);
            logger.debug("set datasource is {}", DynamicDataSource.MY_SQL_DATASOURCE);
        }
        try {
            return point.proceed();
        } finally {
            DynamicDataSource.clearCurrentDatasource();
            logger.debug("clean datasource");
        }
    }
}

6.使用方式

在serviceImpl的方法里面添加@DataSource注解即可

    @Override
    @DataSource("{数据库名字}")
    public Object save( CmdbAsset asset ) {
        // 保存设备时,需要执行一步对设备进行编码的操作。
        String something = dao.doSomething();
    }

这样就简单的实现了数据源的配置,得到帮助的补充详细的点哈,springBoot的配置则将其原理转到Class的配置加上@Configuration,写上@Bean方法配置相关参数即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,848评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,701评论 18 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,527评论 0 4
  • 大家都有自己的生活了,不应该再去打扰的。这是很多人的想法,觉得这是尊重别人生活的一种方式,但是,你有没有想过,不打...
    锦兮辞阅读 353评论 0 0
  • 案主,女,大三学生。 描述: 天气很好,有阳光,花草,很幸福的画面有一个小女孩在拔萝卜,她还养了奶牛和兔子,还有一...
    爱笑的四叶草阅读 138评论 0 0