自spring-boot 2.0開始,spring-boot-autoconfigure提供了influxdb的簡單集成實現類InfluxDbAutoConfiguration. 該類生效條件爲@ConditionalOnClass(InfluxDB.class),所以只要引入influxdb-java依賴,就會自動生效。
compile group: 'org.influxdb', name: 'influxdb-java', version: '2.16'
集成比較簡單(influx本地windows版本1.6.2),代碼如下:
package demo.influx;
import lombok.extern.slf4j.Slf4j;
import org.influxdb.InfluxDB;
import org.influxdb.dto.Point;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* influxDB時序數據庫,支持增查,不支持刪改,刪除可配置刪除策略
* @author tom
*/
@Slf4j
@SpringBootApplication
public class InfluxSpringApplicationDemo implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(InfluxSpringApplicationDemo.class, args);
}
@Autowired
private InfluxDB influxDB;
@Override
public void run(String... args) throws Exception {
influxDB.setDatabase("mydb");
influxDB.write(
Point.measurement("demo_api").tag("name", "hello")
.addField("rt", 10).addField("times", 320)
.build()
);
String line = Point.measurement("demo_api").tag("name", "hello")
.addField("rt", 3).addField("times", 145)
.build().lineProtocol();
log.info("line protocol => {}", line);
//retentionPolicy參數爲自建的policy名稱
//create retention policy mydb_retention_policy on mydb duration 7d replication 1
influxDB.write("mydb", "mydb_retention_policy", InfluxDB.ConsistencyLevel.QUORUM, line);
//i 代表integer數據類型
influxDB.write("mydb", "mydb_retention_policy", InfluxDB.ConsistencyLevel.ONE
, "demo_api,name=hello rt=4i,times=34i");
//默認查詢是select * from mydb.autogen.demo_api
QueryResult rs = influxDB.query(new Query("select * from demo_api", "mydb"));
log.info("query result => {}", rs);
if (!rs.hasError() && !rs.getResults().isEmpty()) {
rs.getResults().forEach(System.out::println);
}
//查詢select * from mydb.mydb_retention_policy.demo_api
rs = influxDB.query(new Query("select * from mydb.mydb_retention_policy.demo_api", "mydb"));
log.info("query result => {}", rs);
if (!rs.hasError() && !rs.getResults().isEmpty()) {
rs.getResults().forEach(System.out::println);
}
}
}
注意:在使用influx客戶端查詢插入結果時,由於自定義了retention policy,所以代碼中插入的結果位於兩個retention policy。
一個measurement(相當於table)內存儲的記錄可以屬於多個retention policy,這個retention policy定義保留策略的,對於不同的策略雖然插入的measurement是同一個,但是數據會歸屬於插入時指定的policy。當查詢不指定policy時,使用默認的autogen,所以在插入到同一個measurement不同的policy時要注意,查詢要指定policy。