zoukankan      html  css  js  c++  java
  • Spring Boot之JdbcTemplate多数据源配置与使用

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可。但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。

    多数据源配置

    创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置。如下例子中,主数据源配置为spring.datasource.primary开头的配置,第二数据源配置为spring.datasource.secondary开头的配置。

    package com.wls.diypro.util.datasource;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.sql.DataSource;
    
    
    @Configuration
    public class DataSourceConfig {
        @Bean(name = "primaryDataSource")
        @Qualifier("primaryDataSource")
        @ConfigurationProperties(prefix="spring.datasource.primary")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
        @Bean(name = "secondaryDataSource")
        @Qualifier("secondaryDataSource")
        @Primary
        @ConfigurationProperties(prefix="spring.datasource.secondary")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "primaryJdbcTemplate")
        public JdbcTemplate primaryJdbcTemplate(
                @Qualifier("primaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
        @Bean(name = "secondaryJdbcTemplate")
        public JdbcTemplate secondaryJdbcTemplate(
                @Qualifier("secondaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    

      

      

    JdbcTemplate支持对应的application-dev.yml配置如下:

     

    spring:
      datasource:
        primary:
          driver-class-name: com.mysql.jdbc.Driver
      #    url: jdbc:mysql://192.168.159.128:3306/mydb
          url: jdbc:mysql://192.168.11.131:3306/mydb
          username: wls
          password: Wls141215!
        secondary:
          driver-class-name: com.mysql.jdbc.Driver
      #    url: jdbc:mysql://192.168.159.128:3306/mydb
          url: jdbc:mysql://192.168.11.131:3306/shopmall
          username: wls
          password: Wls141215!
    

    对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可,如下例子,在创建JdbcTemplate的时候分别注入名为primaryDataSourcesecondaryDataSource的数据源来区分不同的JdbcTemplate。

    @Autowired
        @Qualifier("primaryJdbcTemplate")
        protected JdbcTemplate primaryJdbcTemplate;
    
        @Autowired
        @Qualifier("secondaryJdbcTemplate")
        protected JdbcTemplate secondaryJdbcTemplate;
    

      

     

    package com.wls.diypro.test.jdbcTemplateTest;
    
    import com.wls.diypro.model.OrderInfo;
    import com.wls.diypro.service.IOrderInfoService;
    import junit.framework.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.Date;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class JdbcTemplateTest {
    
        @Autowired
        @Qualifier("primaryJdbcTemplate")
        protected JdbcTemplate primaryJdbcTemplate;
    
        @Autowired
        @Qualifier("secondaryJdbcTemplate")
        protected JdbcTemplate secondaryJdbcTemplate;
    
        @Autowired
        private IOrderInfoService iOrderInfoService;
    
        @Test
        public void addOrder() throws Exception {
            OrderInfo orderInfo = new OrderInfo();
            orderInfo.setAddressDetail("广平大街");
            orderInfo.setArea("大兴区");
            orderInfo.setCity("北京市");
            orderInfo.setOrderNumber("10000001");
            orderInfo.setOrderStatus("2");
            orderInfo.setOrderTime(new Date());
            orderInfo.setProvince("北京");
            orderInfo.setReceiver("王老师");
            orderInfo.setStreet("ces");
            iOrderInfoService.addOrder(orderInfo);
        }
    
    
    
        @Before
        public void setUp() {
            primaryJdbcTemplate.update("DELETE  FROM  order_info ");
            secondaryJdbcTemplate.update("DELETE  FROM  order_info ");
        }
    
        @Test
        public void test() throws Exception {
    
            // 往第一个数据源中插入两条数据
            primaryJdbcTemplate.update("insert into order_info(order_flag,order_number,order_status,street) values(?, ?, ?, ?)", "test", "10001", "S01","广平大街");
            primaryJdbcTemplate.update("insert into order_info(order_flag,order_number,order_status,street) values(?, ?, ?, ?)", "test", "10001", "S01","广平大街");
    
            // 往第二个数据源中插入一条数据,若插入的是第一个数据源,则会主键冲突报错
            secondaryJdbcTemplate.update("insert into order_info(order_flag,order_number,order_status,street) values(?, ?, ?, ?)", "test", "10003", "S02","广平大街");
    
            // 查一下第一个数据源中是否有两条数据,验证插入是否成功
            Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from order_info", String.class));
    
            // 查一下第一个数据源中是否有两条数据,验证插入是否成功
            Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from order_info", String.class));
    
        }
    }
    

      

    完整示例:guithub接下来通过测试用例来演示如何使用这两个针对不同数据源的JdbcTemplate。

     

  • 相关阅读:
    MySQL--lsblk命令查看块设备
    MySQL--linux IO调度算法
    一致性哈希
    MySQL--查询表统计信息
    MySQL--区分表名大小写
    MySQL--Online DDL
    MySQL--MODIFY COLUMN和ALTER COLUMN
    MySQL--修改表字段
    MySQL--增加或修改列注释
    鼠标事件
  • 原文地址:https://www.cnblogs.com/wlsblog/p/7460272.html
Copyright © 2011-2022 走看看