天天看点

springboot 集成influxDb,插入两条数据,只保存了后一条

hello,好久不见,金三银四,希望大家面试成功,冲啊~~

问题描述

代码功能:新增两条student数据到influxdb数据库中

问题:每次运行代码都是新增一条记录

方法一

/**
     * 新增单条记录,利用java的反射机制进行新增操作
     */
    public void insertOne(Object obj,String DB){
        //获取度量
        Class<?> clasz = obj.getClass();
        Measurement measurement = clasz.getAnnotation(Measurement.class);
        //构建
        Point.Builder builder = Point.measurement(measurement.name());
        // 获取对象属性
        Field[] fieldArray = clasz.getDeclaredFields();
        Column column = null;
        for(Field field : fieldArray){
            try {
                column = field.getAnnotation(Column.class);
                //设置属性可操作
                field.setAccessible(true);
                if(column.tag()){
                    //tag属性只能存储String类型
                    builder.tag(column.name(), field.get(obj).toString());
                }else{
                    //设置field
                    if(field.get(obj) != null){
                        builder.addField(column.name(), field.get(obj).toString());
                    }
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                log.error("insertOne err={}", e.getMessage());
            }
        }
        builder.time(System.nanoTime(), TimeUnit.NANOSECONDS);
        influxDB.write(DB,"autogen",builder.build());
    }
           

一、其实两条记录都插入到influxdb数据库中了,只不过数据产生的时间戳一样,time相同的后来数据就会覆盖之前的数据,只要设置不同的time就这解决问题。

设置时间代码:

builder.time(System.nanoTime(), TimeUnit.NANOSECONDS);

看网上很多人改了这个就可以了,结果我本来应该生成两条数据,生成了4条😭,如果你和我一样,那就继续往下看,下面这个是我解决这个问题的方法

方法二

@Measurement(name = "exportData")
public class ExportData {
    @Column(name="deviceId")
    private String deviceId;

    @Column(name="ossURL",tag=true)
    private String ossURL;

    @Column(name="filename")
    private String filename;

    @Column(name="title")
    private String title;

    @Column(name="createTime")
    private long createTime;
}
           

二、如果重新设置了time无效,就将作为唯一标示的字段url 作为tag。我代码中两条数据的deviceId是一致的,然后把deviceId设成tag了,怀疑有影响,结果换了一个字段就好了

springboot 集成influxDb,插入两条数据,只保存了后一条