备注

若依框架默认使用的是mysql数据库,当有写入和查询大量数据而无修改和删除需求时,比如某个硬件每秒钟会存储一条数据,这时候整合一个时序库进来就会极大的提高速度。taos作为国产时序库,官方文档资料还是比较全面的。

Maven

此maven放在admin包的pom中

    <dependency>
        <groupId>com.taosdata.jdbc</groupId>
        <artifactId>taos-jdbcdriver</artifactId>
        <version>3.0.0</version>
    </dependency>

yml

  • 若依是设计了多数据源的情况的,但如果数据源不是同一类型数据库的情况下,还是要小改动一下。
  • 这里有两点需要注意,driverClassName驱动类型不同和validationQuery配置检测连接是否有效的sql语句不同,其他根据需要配置
  • 时序库的连接方式我使用了rest风格,性能会略有下降。可以更改为原生连接,但需要安装客户端驱动,这里只是测试,就不使用原生连接了。
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 主库数据源
      master:
        url: 
        username: 
        password: 
        driverClassName: com.mysql.cj.jdbc.Driver
        initialSize: 5
        minIdle: 10
        maxActive: 20
        maxWait: 60000
        connectTimeout: 30000
        socketTimeout: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        maxEvictableIdleTimeMillis: 900000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
      # 从库数据源
      slave:
        # 从数据源开关
        enabled: true
        url: jdbc:TAOS-RS://地址:端口/库名
        username: 
        password: 
        driverClassName: com.taosdata.jdbc.rs.RestfulDriver
        validationQuery: select server_status();
        initialSize: 5
        minIdle: 10
        maxActive: 20
        maxWait: 60000

config

改了yml当然要改配置文件,以下标示的地方需要改动

/**
 * 数据源
 */
public enum DataSourceType
{
    /** 主库 */
    MASTER,

    /** 从库 */
    SLAVE
}
/**
 * druid 配置属性 主库
 */
@Configuration
public class DruidProperties1
{
    @Value("${spring.datasource.druid.master.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.druid.master.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.druid.master.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.druid.master.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.druid.master.connectTimeout}")
    private int connectTimeout;

    @Value("${spring.datasource.druid.master.socketTimeout}")
    private int socketTimeout;

    @Value("${spring.datasource.druid.master.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.master.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.master.maxEvictableIdleTimeMillis}")
    private int maxEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.master.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.druid.master.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.master.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.master.testOnReturn}")
    private boolean testOnReturn;

    public DruidDataSource dataSource(DruidDataSource datasource)
    {
        /** 配置初始化大小、最小、最大 */
        datasource.setInitialSize(initialSize);
        datasource.setMaxActive(maxActive);
        datasource.setMinIdle(minIdle);

        /** 配置获取连接等待超时的时间 */
        datasource.setMaxWait(maxWait);
        
        /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */
        datasource.setConnectTimeout(connectTimeout);
        
        /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */
        datasource.setSocketTimeout(socketTimeout);

        /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

        /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);

        /** 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 */
        datasource.setValidationQuery(validationQuery);
        
        /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
        datasource.setTestWhileIdle(testWhileIdle);
        
        /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnBorrow(testOnBorrow);
        
        /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnReturn(testOnReturn);
        
        return datasource;
    }
}
/**
 * druid 配置属性 从库
 */
@Configuration
public class DruidProperties2
{
    @Value("${spring.datasource.druid.slave.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.druid.slave.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.druid.slave.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.druid.slave.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.druid.slave.validationQuery}")
    private String validationQuery;


    public DruidDataSource dataSource(DruidDataSource datasource)
    {
        /** 配置初始化大小、最小、最大 */
        datasource.setInitialSize(initialSize);
        datasource.setMaxActive(maxActive);
        datasource.setMinIdle(minIdle);
        
        /** 配置获取连接等待超时的时间 */
        datasource.setMaxWait(maxWait);
        /** 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 */
        datasource.setValidationQuery(validationQuery);
        
        return datasource;
    }
}

测试

流程上与使用mysql时基本无区别,甚至连sql语法大部分都是通用的,只是在Service层需要使用@DataSource注解切换数据源,这个注解既可以放在类上也可以放在方法上

@RequestMapping("/taosData")
@RestController
public class TaosController {

    @Autowired
    private ITaosService taosService;

    @GetMapping("/count")
    public int count() {
        return taosService.count();
    }
}
public interface ITaosService {
    int count();
}
@Service
public class TaosServiceImpl implements ITaosService{

    @Autowired
    private TaosMapper taosMapper;


    @DataSource(value = DataSourceType.SLAVE)
    @Override
    public int count() {
        return taosMapper.count();
    }
}
public interface TaosMapper {
    int count();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.ruoyi.taos.mapper.TaosMapper">

    <select id="count" resultType="java.lang.Integer">
        select
        	count(*)
        from
        	test.stable
    </select>
</mapper>

注意

如果你在mybatis-config.xml配置文件中全局参数开启了自动生成主键,使用insert标签会报错,需要单独给语句设置关闭生成主键useGeneratedKeys=“false”

    <insert id="" parameterType="" useGeneratedKeys="false">
        INSERT INTO  USING 
        TAGS
            ()
        VALUES
            ()
    </insert>

在这里插入图片描述

Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐