返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java实现多数据源的方式
  • 267
分享到

Java实现多数据源的方式

javaspringmybatis 2023-08-23 06:08:25 267人浏览 八月长安
摘要

Java实现多数据源的方式 文章目录 Java实现多数据源的方式一、利用Spring提供的类实现1)在yml文件当中配置多数据源2) 定义一个DataSourceConfig 配置类来配置两个数据源3)自定义一个类 来 继承 org

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

--结束END--

本文标题: Java实现多数据源的方式

本文链接: https://lsjlt.com/news/378363.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作