文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java实现多数据源的方式

2023-08-23 06:29

关注

Java实现多数据源的方式

一、利用Spring提供的类实现

1)在yml文件当中配置多数据源

spring:  datasource:    type: com.alibaba.druid.pool.DruidDataSource    datasource1:      url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false      username: root      password: root      initial-size: 1      min-idle: 1      max-active: 20      test-on-borrow: true      driver-class-name: com.mysql.cj.jdbc.Driver    datasource2:      url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false      username: root      password: root      initial-size: 1      min-idle: 1      max-active: 20      test-on-borrow: true      driver-class-name: com.mysql.cj.jdbc.Driver

2) 定义一个DataSourceConfig 配置类来配置两个数据源

@Configurationpublic class DataSourceConfig {    @Bean    @ConfigurationProperties(prefix = "spring.datasource.datasource1")    public DataSource dataSource1() {        // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource        return DruidDataSourceBuilder.create().build();    }    @Bean    @ConfigurationProperties(prefix = "spring.datasource.datasource2")    public DataSource dataSource2() {        // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource        return DruidDataSourceBuilder.create().build();    }        @Bean    public DataSourceTransactionManager transactionManager1(DynamicDataSource dataSource){        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();        dataSourceTransactionManager.setDataSource(dataSource);        return dataSourceTransactionManager;    }    @Bean    public DataSourceTransactionManager transactionManager2(DynamicDataSource dataSource){        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();        dataSourceTransactionManager.setDataSource(dataSource);        return dataSourceTransactionManager;    }}

3)自定义一个类 来 继承 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

** 在类里面注入分别注入两个数据源**

  // 写    @Autowired    DataSource dataSource1;    // 读    @Autowired    DataSource dataSource2;        // 返回当前数据源标识    @Override    protected Object determineCurrentLookupKey() {        return name.get();            }

** 在这个类初始化完成之后,进行数据源的注入**

       // 当前使用的数据源标识    public static ThreadLocal<String> name=new ThreadLocal<>();    @Override    public void afterPropertiesSet() {        // 为targetDataSources初始化所有数据源        Map<Object, Object> targetDataSources=new HashMap<>();        targetDataSources.put("W",dataSource1);        targetDataSources.put("R",dataSource2);        super.setTargetDataSources(targetDataSources);        // 为defaultTargetDataSource 设置默认的数据源        super.setDefaultTargetDataSource(dataSource1);        super.afterPropertiesSet();    }

**在service中使用指定的数据源 **

@Servicepublic class FriendImplService implements FriendService {    @Autowired    FriendMapper friendMapper;    @Override    @WR("R")        // 库2    public List<Friend> list() {//        DynamicDataSource.name.set("R");        return friendMapper.list();    }    @Override    @WR("W")        // 库1    public void save(Friend friend) {//        DynamicDataSource.name.set("W");        friendMapper.save(friend);    }}

上面采用注解的方式就是,其实是利用切面进行数据源的设置,和注释的注释方式类似

二、利用mybatis层次实现

1)分别配置两个配置源,单独配置

** 编写WMyBatisConfig配置文件**

@Configuration// 继承mybatis:// 1. 指定扫描的mapper接口包(主库)// 2. 指定使用sqlSessionFactory是哪个(主库)@MapperScan(basePackages = "com.datasource.dynamic.mybatis.mapper.w",        sqlSessionFactoryRef="wSqlSessionFactory")public class WMyBatisConfig {    @Bean    @ConfigurationProperties(prefix = "spring.datasource.datasource1")    public DataSource dataSource1() {        // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource        return DruidDataSourceBuilder.create().build();    }    @Bean    @Primary    public SqlSessionFactory wSqlSessionFactory()            throws Exception {        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        // 指定主库        sessionFactory.setDataSource(dataSource1());        // 指定主库对应的mapper.xml文件                return sessionFactory.getObject();    }    @Bean    @Primary    public DataSourceTransactionManager wTransactionManager(){        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();        dataSourceTransactionManager.setDataSource(dataSource1());        return dataSourceTransactionManager;    }    @Bean    public TransactionTemplate wTransactionTemplate(){        return new TransactionTemplate(wTransactionManager());    }}

** 编写RMyBatisConfig 配置文件**

@Configuration// 继承mybatis:// 1. 指定扫描的mapper接口包(主库)// 2. 指定使用sqlSessionFactory是哪个(主库)@MapperScan(basePackages = "com.tuling.datasource.dynamic.mybatis.mapper.w",        sqlSessionFactoryRef="wSqlSessionFactory")public class WMyBatisConfig {    @Bean    @ConfigurationProperties(prefix = "spring.datasource.datasource1")    public DataSource dataSource1() {        // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource        return DruidDataSourceBuilder.create().build();    }    @Bean    @Primary    public SqlSessionFactory wSqlSessionFactory()            throws Exception {        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        // 指定主库        sessionFactory.setDataSource(dataSource1());        // 指定主库对应的mapper.xml文件                return sessionFactory.getObject();    }    @Bean    @Primary    public DataSourceTransactionManager wTransactionManager(){        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();        dataSourceTransactionManager.setDataSource(dataSource1());        return dataSourceTransactionManager;    }    @Bean    public TransactionTemplate wTransactionTemplate(){        return new TransactionTemplate(wTransactionManager());    }}

2) 在serviceImpl实现层 单独调用配置的Mapper代理类

 @Autowired    private RFriendMapper rFriendMapper;    @Autowired    private WFriendMapper wFriendMapper;    // 读-- 读库    @Override    public List<Friend> list() {        return rFriendMapper.list();    }  // 保存-- 写库    @Override    public void saveW(Friend friend) {        friend.setName("loulan");        wFriendMapper.save(friend);    }    // 保存-- 读库    @Override    public void saveR(Friend friend) {        friend.setName("loulan");        rFriendMapper.save(friend);    }

三、Spring自动化支持

1) 引入pom依赖

             com.baomidou            dynamic-datasource-spring-boot-starter            3.5.0        

2)在service层利用注解==@DS实现==

@Servicepublic class FriendImplService implements FriendService {    @Autowired    FriendMapper friendMapper;    @Override    @DS("slave_1")  // 从库, 如果按照下划线命名方式配置多个  , 可以指定前缀即可(组名)    public List<Friend> list() {        return friendMapper.list();    }    @Override    @DS("master")    public void save(Friend friend) {        friendMapper.save(friend);    }    @DS("master")    @DSTransactional    public void saveAll(){        // 执行多数据源的操作    }}

来源地址:https://blog.csdn.net/weixin_46350527/article/details/129144775

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯