springboot操作influxdb

1.influxdb安装(docker)

1.拉取镜像

docker pull influxdb:1.8

2.运行

docker run -d -p 8086:8086 --name influxdb1.8
-v /lzp/influxdb:/var/lib/influxdb
–restart=always
influxdb:1.8
这个文件映射是数据文件,配置文件在/etc/influxdb 目录下
运行后效果
springboot操作influxdb_第1张图片

其中data保存数据文件 tsm结尾的文件

3.修改配置

springboot操作influxdb_第2张图片

在容器中安装vim
1.apt-get update
2.apt-get install vim
安装之后编辑配置文件
[data]
1.max-series-per-database = 1000000
每个数据库允许的最大series数,默认设置是一百万。series 指 tag、measurement、policy 相同的数据集合
将该设置更改为0,以允许每个数据库的序列数量不受限制。
若超过则会返回500错误,并提示{“error”:“max series per database exceeded: ”}
2.max-values-per-tag = 100000
设置每一个tag允许的value最大数量,默认10W,设置0可以取消限制。
若超过该数值,则会返回错误
[http]
3.auth-enabled = true
开启登陆验证
springboot操作influxdb_第3张图片

4.增加用户

进入容器后输入influx 客户端登陆
create user “root” with password ‘zh123456’ with all privileges

2.springboot集成

1.pom

        <dependency>
            <groupId>plus.ojbk</groupId>
            <artifactId>influxdb-spring-boot-starter</artifactId>
            <version>1.0.2</version>
        </dependency>

2.配置文件

influxdb.url=http://192.168.56.10:8086
influxdb.username=root
influxdb.password=zh123456
influxdb.database=device

3.配置类

这个配置类的功能是增加各种操作延时时间,避免查询大量数据时延时报错。
思路是继承原有的自动配置类,重写influxdb的构造方法,将时间配置进去。
这个自动配置类不是官方提供的,是pom依赖作者自己写的,所以普通的修改方式无效,必须以这种重写的方式实现。

@Configuration
public class InlConfig extends InfluxdbAutoConfiguration {

    @Override
    public InfluxDB influxdb(InfluxdbProperties influxdbProperties) {

         OkHttpClient.Builder client = new OkHttpClient.Builder().readTimeout(1000000, TimeUnit.SECONDS);
        InfluxDB influxDB = InfluxDBFactory.connect(influxdbProperties.getUrl(), influxdbProperties.getUsername(), influxdbProperties.getPassword(),client);
        influxDB.setDatabase(influxdbProperties.getDatabase());
        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
        return influxDB;
    }

    @Override
    public InfluxdbTemplate influxdbTemplate(InfluxdbProperties influxdbProperties) {
        return super.influxdbTemplate(influxdbProperties);
    }
}

###3.创建测试类
@Measurement(name = “device”)对应表名
时间必须使用LocalDateTime 使用date类型会报错

@Data
@Measurement(name = "device")
public class Device {
    /**
     * 设备编号
     */
    @Column(name="device_no", tag = true)  //tag 可以理解为influxdb的索引
    private String deviceNo;
    /**
     * 数据值
     */
    @Count("value")
    @Column(name="value")
    private BigDecimal value;
    /**
     * 电压
     */

    @Column(name="voltage")
    private Float voltage;
    /**
     * 状态
     */
    @Column(name="state")
    private Boolean state;
    /**
     * 上报时间
     */
    @Column(name="time")
    private LocalDateTime time;

    /**
     * 上报时间
     */
    @Column(name="test")
    public String test;
}

4.创建测试方法

插入 每条数据时间增加五秒

    @Test
    void insert() {
        Calendar begin=Calendar.getInstance();
        begin.setTime(new Date());//给定起始时间

        List<Device> deviceList = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            begin.add(Calendar.SECOND,5);//增加了5s
            LocalDateTime localDateTime = LocalDateTime.ofInstant(begin.toInstant(), begin.getTimeZone().toZoneId());
            Device device = new Device();
            device.setDeviceNo("device-" + i);
            device.setValue(new BigDecimal(12.548));
            device.setState(true);
            device.setVoltage(3.5F);
            device.setTime(localDateTime);
            device.setTest("123");
            deviceList.add(device);
           //influxdbTemplate.insert(deviceList);
           //5w条插入一次
            if(deviceList.size()%50000==0){
                influxdbTemplate.insert(deviceList);
                deviceList.clear();
            }

        }
        //influxdbTemplate.insert(deviceList);
    }

获取数量
    @Test
    void getCount() {
        QueryModel countModel = new QueryModel();
        ///countModel.setMeasurement(measurement);
        countModel.setMeasurement(InfluxdbUtils.getMeasurement(Device.class));
//        countModel.setStart(LocalDateTime.now().plusHours(+1L));
//        countModel.setEnd(LocalDateTime.now().plusHours(+2L));
        //countModel.setSelect(Query.count("voltage"));  //只能count field字段
        countModel.setSelect(Query.count(InfluxdbUtils.getCountField(Device.class)));
        countModel.setWhere(Op.where(countModel));
        //获得总条数
        long count = influxdbTemplate.count(Query.build(countModel));
        System.err.println(count);
    }

获取数据
    @Test
    void getData() {
        QueryModel model = new QueryModel();
        //当前页
//        model.setCurrent(1L);
//        //每页数量
//        model.setSize(1L);
        //model.setMeasurement(measurement);
        //表名
        model.setMeasurement(InfluxdbUtils.getMeasurement(Device.class));
        //查询的字段
        model.setSelect("voltage,state");

        Date date = new Date();
        model.setStart(LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()));
        model.setEnd(LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()).plusHours(+1));
        model.setUseTimeZone(true);  //时区 这个如果数据库在windows 会报错 需要屏蔽掉
        //model.setOrder(Order.DESC);  //排序
        //where 条件中额外参数可放入model.setMap();
        model.setWhere(Op.where(model));
        //分页数据
        System.out.println(LocalDateTime.now());
        List<Device> deviceList = influxdbTemplate.selectList(Query.build(model), Device.class);
        System.out.println(LocalDateTime.now());
        System.out.println(deviceList.size());
        System.err.println(JSON.toJSONString(deviceList));
    }

参考链接

你可能感兴趣的:(springboot,spring,boot,java,数据库)