我正在尝试使用他们的Java客户端向InfluxDB写点。 批量对我很重要。
如果我使用InfluxDB.enableBatch和InfluxDB.write(Point),则不会插入任何数据。 如果我使用BatchPoints和InfluxDB.write(batchPoints) - 数据插入成功。
两个代码示例均来自:https://github.com/influxdata/influxdb-java/tree/influxdb-java-2.7
InfluxDB influxDB = InfluxDBFactory.connect(influxUrl, influxUser, influxPassword);
influxDB.setDatabase(dbName);
influxDB.setRetentionPolicy("autogen");
// Flush every 2000 Points, at least every 100ms
influxDB.enableBatch(2000, 100, TimeUnit.MILLISECONDS);
influxDB.write(Point.measurement("cpu")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.addField("idle", 90L)
.addField("user", 9L)
.addField("system", 1L)
.build());
Query query = new Query("SELECT idle FROM cpu", dbName);
QueryResult result = influxDB.query(query);
什么都不返回。
BatchPoints batchPoints = BatchPoints.database(dbName).tag("async", "true").build();
Point point1 = Point
.measurement("cpu")
.tag("atag", "test")
.addField("idle", 90L)
.addField("usertime", 9L)
.addField("system", 1L)
.build();
batchPoints.point(point1);
influxDB.write(batchPoints);
Query query = new Query("SELECT * FROM cpu ", dbName);
QueryResult result = influxDB.query(query);
这会成功返回数据。
如上所述,我需要第一种方式来运作。 我怎样才能做到这一点?
版本: influxdb-1.3.6 influxdb-java的:2.7
问候,Ido
答案 0 :(得分:1)
也许已经太晚了,或者你已经解决了你的问题,但我会回答你的问题,这可能对其他人有用。
我认为您的第一个示例无效,因为您启用了批处理功能,它将“刷新每2000点,至少每100毫秒”。所以基本上它正在工作,但是你在执行实际保存之前进行选择。
当您使用influxDB.enableBatch(...);
功能时,Influxdb-client会在收集数据或超时后创建内部线程池来存储您的数据,并且不会立即执行。
在第二个示例中,当您使用influxDB.write(batchPoints);
时,Influxdb-client正在将您的数据同步写入InfluxDb。这就是你的select语句能够立即返回数据的原因。