首页 > 其他分享 >多数据源

多数据源

时间:2023-05-16 11:36:49浏览次数:33  
标签:return 数据源 hikariDataSource mysql new public

多数据源

实现AbstractRoutingDataSource抽象类

新建数据源

在configuration中注入多个数据源

    @Bean
    public DataSource dataSource1() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl("jdbc:mysql://192.168.18.117:3306/study");
        hikariDataSource.setUsername("root");
        hikariDataSource.setPassword("365373011");
        hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        return hikariDataSource;
    }

        @Bean
    public DataSource dataSource2() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl("jdbc:mysql://192.168.18.226:3306/study");
        hikariDataSource.setUsername("root");
        hikariDataSource.setPassword("52701314");
        hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        return hikariDataSource;
    }

实现抽象AbstractRoutingDataSource类

配置数据源key与value之间的对应关系,根据ThreadLocal中的字符串对象来获取数据源进行切换,ThreadLocal等于w时那么就是使用DataSource1,ThreadLocal等于r时,那么就使用Data Source2.

@Configuration
public class DynamicDatasource extends AbstractRoutingDataSource {
    public static ThreadLocal<String> name = new ThreadLocal<>();

    @Autowired
    @Qualifier("dataSource1")
    private DataSource dataSource1;

    @Autowired
    @Qualifier("dataSource2")
    private DataSource dataSource2;

    @Override
    protected Object determineCurrentLookupKey() {
        return name.get();
    }

    @Override
    public void afterPropertiesSet() {
        Map<Object, Object> dataSourceMap = new HashMap<>();

        // 设置数据源key与value之间的对应关系
        dataSourceMap.put("W", dataSource1);
        dataSourceMap.put("R", dataSource2);
        
        super.setTargetDataSources(dataSourceMap);
        // 设置默认数据源
        super.setDefaultTargetDataSource(dataSource2);

        super.afterPropertiesSet();
    }
}

使用DynamicDatasource

将DynamicDatasource注入到SqlSessionFactoryBean中,依靠DynamicDatasource实现myabtis数据源的动态切换。

    @Bean
    public SqlSessionFactory sqlSessionFactory(@Autowired DynamicDatasource dynamicDatasource) {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dynamicDatasource);

        try {
            return sqlSessionFactory.getObject();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

在controller中进行测试

ThreadLocal等于w时那么就是使用DataSource1,ThreadLocal等于r时,那么就使用Data Source2,这里可以采用AOP + 注解的方式进行优化,利用AOP扫描所有包,判断包下的是否有注解,如果有注解则获取注解中的value,根据value切换ThreadLocal设置ThreadLocal,以此来实现切换数据源。

@RestController
public class TestController {
    @Autowired
    private UserDAO userDAO;


    @GetMapping("/R")
    public Object test() {

        DynamicDatasource.name.set("W");
        return userDAO.list();
    }

    @GetMapping("/W")
    public Object w() {
        DynamicDatasource.name.set("R");
        return userDAO.list();
    }
}

数据库存储内容如下
数据源1:
img
数据源2:
img
执行结果如下
W接口:
img
R接口:
img

创建多个SqlSessionFactory

根据数据源的不同,创建不同的SqlSessionFactoryBean,根据不同的SqlSessionFactoryBean扫描不同的包,创建不同的mapper,根据数据源的不同导入不同数据源的mapper即可

创建多个SqlSessionFactory

mapperScan中指定了mapper路径和使用的SqlSessionFactoryBean的bean名称。

@Configuration
@MapperScan(basePackages = "com.lyra.dao.w", sqlSessionFactoryRef = "wSqlSessionFactory")
public class WDatasouce {
    @Bean
    public DataSource dataSource2() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl("jdbc:mysql://192.168.18.227:3306/study");
        hikariDataSource.setUsername("root");
        hikariDataSource.setPassword("52701314");
        hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        return hikariDataSource;
    }




    @Bean(value = "wSqlSessionFactory")
    public SqlSessionFactory wSqlSessionFactory() {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource2());

        try {
            return sqlSessionFactory.getObject();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

@Configuration
@MapperScan(basePackages = "com.lyra.dao.r", sqlSessionFactoryRef = "rSqlSessionFactory")
public class DataSourceConfig {
        @Bean
    public DataSource dataSource1() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl("jdbc:mysql://192.168.18.117:3306/study");
        hikariDataSource.setUsername("root");
        hikariDataSource.setPassword("365373011");
        hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        return hikariDataSource;
    }


    @Bean(value = "rSqlSessionFactory")
    public SqlSessionFactory rSqlSessionFactory() {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource1());

        try {
            return sqlSessionFactory.getObject();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

在Mapper中根据不同的数据源创建不同的mapper

img

测试

执行结果和之前方法1也是一样的
W接口:
img
R接口:
img

dynamic-datasource-spring

文档: https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611

导依赖

    <!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.6.1</version>
        </dependency>

配置数据源

配置两个数据源分别是w和r,和一个primary数据源,如果没有使用ds注解,那么默认使用的就是primary中配置的数据源

spring:
  datasource:
    dynamic:
      primary: w
      datasource:
        w:
          url: jdbc:mysql://192.168.18.117:3306/study
          username: root
          password: 365373011
          driver-class-name: com.mysql.cj.jdbc.Driver
        r:
          url: jdbc:mysql://192.168.18.227:3306/study
          username: root
          password: 52701314
          driver-class-name: com.mysql.cj.jdbc.Driver

使用DS注解

利用DS注解切换不同的数据源

@RestController
public class TestController {
    @Autowired
    private UserDAO userDAO;

    @Autowired
    private WUserDAO wUserDAO;

    @GetMapping("/R")
    @DS("r")
    public Object test() {
        return wUserDAO.list();
    }

    @GetMapping("/W")
    @DS("w")
    public Object w() {
        return userDAO.list();
    }
}

测试

执行结果和之前方法1也是一样的
W接口:
img
R接口:
img

标签:return,数据源,hikariDataSource,mysql,new,public
From: https://www.cnblogs.com/lyraHeartstrings/p/17403493.html

相关文章

  • Grafana系列-统一展示-9-Jaeger数据源
    系列文章Grafana系列文章配置JaegerdatasourceGrafana内置了对Jaeger的支持,它提供了开源的端到端分布式跟踪。本文解释了针对Jaeger数据源的配置和查询。关键的配置如下:URL:Jaeger实例的URL,如:http://localhost:16686或http://localhost:16686/trace/Enable......
  • Mybatis-Plus 多数据源
    适用于多种场景:纯粹多库、读写分离、一主多从、混合模式等目前我们就来模拟一个纯粹多库的一个场景,其他场景类似场景说明:我们创建两个库,分别为:mybatis_plus与mybatis_plus_1,mybatis_plus有t_user表,mybatis_plus_1有t_product表,分别获取两个库的两张表,如果都能获取成功,就说......
  • Grafana系列-统一展示-7-ElasticSearch数据源
    系列文章Grafana系列文章ElasticSearch数据源Grafana内置了对Elasticsearch的支持。你可以进行多种类型的查询,以可视化存储在Elasticsearch中的日志或指标,并使用存储在Elasticsearch中的日志事件对图表进行注释。配置ES数据源关键的几项配置如下:URL:设置你的Elasti......
  • 解决Failed to configure a DataSource: ‘url‘ attribute is not specified and no
    <groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency>开始没有制定版本报错换成了8.0版本,依旧报错 看了下配置文件没有问题查了下应该是版本冲突的问题<d......
  • Grafana 系列-统一展示-2-Prometheus 数据源
    系列文章Grafana系列文章GrafanaPrometheus数据源Grafana提供了对Prometheus的内置支持。本文会介绍GrafanaPrometheus(也包括Prometheus的兼容实现,如Thanos,Mimir等)数据源的部分选项、变量(Variable)、查询(Query)和其他针对Prometheus数据源的功能。配......
  • Tomcat6.0配置JNDI数据源完整例子(5.5与此配置相同)
    关键字:Tomcat6.0配置JNDI数据源注意事项:tomcatJDK一定要和应用程序的JDK版本一致(本例中统一JDK1.6)说明:tomcat5.5与6.0的配置略有不同,即:tomcat的lib位置不同(其他完全一致),6.0位置是:D:\我的工具\apache-tomcat-6.0.10\lib下5.5位置是:D:\我的工具\apa......
  • Spring17_配置数据源6
    一、数据源(连接池)的作用数据源(连接池)是为提高程序性能而出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等二、数据源开发步骤1.导入数据源的坐标和数据......
  • Springboot 之 Mybatis-plus 多数据源
    简介Mybatis-puls多数据源的使用,采用的是官方提供的dynamic-datasource-spring-boot-starter包的@DS注解,具体可以参考官网:https://gitee.com/baomidou/dynamic-datasource-spring-boot-starterpom.xml文件引入如下依赖主要引入dynamic-datasource-spring-boot-starter包<project......
  • OFDM图像传输系统matlab仿真,以图片作为数据源进行发送,接收端还原图片,对比MPSK,MQAM
    1.算法仿真效果matlab2022a仿真结果如下:        2.算法涉及理论知识概要        移动视频图像传输,广泛用于公安指挥车、交通事故勘探车、消防武警现场指挥车和海关、油田、矿山、水利、电力、金融、海事,以及其它的紧急、应急指挥系统,主要作用是将......
  • 使用arcpy替换工程文件中的栅格图层数据源异常
    参考:https://www.cnblogs.com/Leechg/p/10668992.html前面的1月1日到1月31日输出正常但是从2月1日开始就开始重复输出1月1日的图片到3月1日开始也是输出1月1日的图片。。难道每个月的必须分开存放?原因是???......