IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springboot操作influxdb -> 正文阅读

[Java知识库]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 目录下
运行后效果
在这里插入图片描述

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

3.修改配置

在这里插入图片描述

在容器中安装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
开启登陆验证
在这里插入图片描述

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));
    }

参考链接

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:12:25  更:2022-11-05 00:16:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 18:44:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码