springBoot+Mybatis多數據源配置

maonidou(苞米豆)團隊針對springboot使用多數據源提供了一個啓動器:dynamic-datasource-spring-boot-starter
我們在pom文件中添加依賴

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>2.5.6</version>
</dependency>

這裏我配置了Druid連接池,需要注意的是我們要排除原生的Druid的快速配置類。

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

爲什麼要排除呢?
DruidDataSourceAutoConfigure在DynamciDataSourceAutoConfiguration之前,其會注入一個DataSourceWrapper,會在原生的spring.datasource下找url,username,password等。而我們動態數據源的配置路徑是變化的。

此時我們修改application.properties,配置主從數據庫(注意配置默認數據源)

# 默認數據源
spring.datasource.dynamic.primary=master
# 主庫配置 master
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://172.16.0.157:3306/guoheng?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8


# 從庫配置 slave
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://172.16.1.18:3306/guoheng?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8

配置好以上的東西就能使用多數據源了,下面展示例子
我在mapper層切換數據源向從數據庫查詢數據插入到主數據庫中

package com.guoheng.safe.sys.mapper.iot;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.guoheng.safe.sys.model.iot.IotData;
import org.apache.ibatis.annotations.Mapper;
@DS("slave")
@Mapper
public interface IotDataMapper {
    IotData selectLastOne();
    }

注意:我這個mapper接口使用了@DS(“slave”)註解,表示使用的是從數據庫,如果不使用@DS註解,使用默認配置數據源。@DS註解可以註解在service層,也可以註解在mapper層,當在service層時,整個業務中使用的都是這個數據源,註解在mapper層時,可以在不同邏輯中切換不同數據源。但強烈不建議同時在service和mapper註解。 (可能會有問題)

package com.guoheng.safe.sys.scheduling;

import com.guoheng.safe.sys.model.iot.IotData;
import com.guoheng.safe.sys.model.map.SensorData;
import com.guoheng.safe.sys.service.HazardMapService;
import com.guoheng.safe.sys.service.IotDataService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 類功能描述: IotDataScheduling
 *
 * @author Eternal
 * @date 2019-30-12 13:30
 */
@Component
public class IotDataScheduling {

    @Resource
    IotDataService iotDataService;

    @Resource
    HazardMapService hazardMapService;

   /* @Scheduled(cron = "0/5 * * * * ?")*/
    public void getIotData() throws ParseException {
        IotData iotData = iotDataService.selectLastOne();

        SensorData sensorData = new SensorData();
        sensorData.setSensorNo(iotData.getBh());
        sensorData.setSensorValue(iotData.getDataValue().doubleValue());
        String collectTime = iotData.getCollectTime();
        SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDDHHMMSS");
        Date time = sdf.parse(collectTime);
        sensorData.setCreateTime(time);
        
        hazardMapService.addSensorData(sensorData);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章