• 使用Spring的AbstractRoutingDataSource类来进行拓展多数据源


    1.继承抽象类AbstractRoutingDataSource

    通过重写这个抽象类的determineCurrentLookupKey()方法来决定返回哪个数据库。

    2.配置多个数据库

    <bean id="dataSource" class="com.bihang.util.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="ssm1DataSource" value-ref="ssm1DataSource"/>
                <entry key="ssm2DataSource" value-ref="ssm2DataSource"/>
            </map>
        </property>
        <!--默认数据源-->
        <property name="defaultTargetDataSource" ref="ssm1DataSource"/>
    </bean>
    

    因为com.bihang.util.DynamicDataSource这个类继承了AbstractRoutingDataSource这个抽象类,所以也继承了父类的成员,所以利用依赖注入将数据源名称和对应的数据库注入进去。

    Mybatis用到数据库就会找这个叫dataSource的数据源,而此时dataSource是有多个数据源的,具体用哪一个它会去找刚刚继承实现的determineCurrentLookupKey()这个方法返回的数据源名称,从而决定使用那个数据源。数据源名称是使用ThreadLocal来保存的。

    总而言之,我们现在控制determineCurrentLookupKey()这个抽象方法返回的数据源名称就可以决定用哪个数据库。

    但是这样每次想要调用数据库时要提供对应的数据源名称,很繁琐。

    我们采用将不同数据库的业务方法存放在不同的包下,然后利用反射获取包名,再用aop动态的赋值数据源名称。

    aop里面会利用JoinPoint对象来获取目标对象从而获取包名。

    JoinPoint 对象

    JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象.

    String toString();         //连接点所在位置的相关信息
    String toShortString();     //连接点所在位置的简短相关信息
    String toLongString();     //连接点所在位置的全部相关信息
    Object getThis();         //返回AOP代理对象
    Object getTarget();       //返回目标对象
    Object[] getArgs();       //返回被通知方法参数列表
    Signature getSignature();  //返回当前连接点签名
    SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置
    String getKind();        //连接点类型
    StaticPart getStaticPart(); //返回连接点静态部分
    

    具体代码:

    Logger logger = Logger.getLogger(this.getClass());
    public void before(JoinPoint point){
        Class<?> targetClass  = point.getTarget().getClass();
        String targetPackageName =targetClass.getName();
        logger.debug(targetPackageName);
        if (targetPackageName.contains("ssmone")){
            DataSourceHolder.setDataSources(Constants.DATASOURCE_ONE);
        }else {
            DataSourceHolder.setDataSources(Constants.DATASOURCE_TWO);
        }
    }
    
    public void after() {
        DataSourceHolder.setDataSources(null);
    }
    
  • 相关阅读:
    hdu1716排列2(stl:next_permutation+优先队列)
    iOS UIWebView 载入https 网站出现NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,
    C++学习笔记23,类内函数重载
    Java---16---多线程---死锁
    Ubuntu上的Hadoop安装教程
    SAP BAPI一览 史上最全
    python脚本从excel表到处数据,生成指定格式的文件
    hdu 4865 Peter&#39;s Hobby
    【VUE】100. vue踩坑集锦
    【VUE】2.搭建vue脚手架@vue/cli,新建第一个vue项目
  • 原文地址:https://www.cnblogs.com/bihanghang/p/10034267.html
Copyright © 2020-2023  润新知