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了,怀疑有影响,结果换了一个字段就好了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPVRVT5FkeOVzaU1UdwJDTwYVbiVHNHpleO1GTulzRilWO5xkNNh0YwIFSh9Fd4VGdsATMfd3bkFGazxyaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cWZwpmL5IDN3ITO1UTMwEzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)