zoukankan      html  css  js  c++  java
  • 使用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);
    }
    
  • 相关阅读:
    django中有外键关系两张表的相互查找方法
    Python的Django框架中forms表单类的使用方法详解
    Django 模板中 变量 过滤器 标签 的使用方法
    Django如何让未登录的用户自动跳转至登录页
    Django 前后台的数据传递
    用css实现在横线中间插入文字
    CSS控制字体在一行内显示不换行
    如何在python3环境下的Django中使用MySQL数据库
    Linux小技巧之:两种方法统计访问web网站的前10个IP
    通过explain分析低效的SQL执行计划
  • 原文地址:https://www.cnblogs.com/bihanghang/p/10034267.html
Copyright © 2011-2022 走看看