Influx db java客户端批处理不写入DB

时间:2017-10-23 08:57:42

标签: java influxdb

我正在尝试使用他们的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

1 个答案:

答案 0 :(得分:1)

也许已经太晚了,或者你已经解决了你的问题,但我会回答你的问题,这可能对其他人有用。

我认为您的第一个示例无效,因为您启用了批处理功能,它将“刷新每2000点,至少每100毫秒”。所以基本上它正在工作,但是你在执行实际保存之前进行选择。 当您使用influxDB.enableBatch(...);功能时,Influxdb-client会在收集数据或超时后创建内部线程池来存储您的数据,并且不会立即执行。

在第二个示例中,当您使用influxDB.write(batchPoints);时,Influxdb-client正在将您的数据同步写入InfluxDb。这就是你的select语句能够立即返回数据的原因。