依赖
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>6.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.10.0</version>
</dependency>
配置
package io.geekidea.boot.config;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "influx2")
public class InfluxConfig {
private String url;
private String token;
private String org;
private String bucket;
@Bean
public InfluxDBClient influxDBClient(){
return InfluxDBClientFactory.create(url, token.toCharArray(),org,bucket);
}
public void setUrl(String url) {
this.url = url;
}
public void setToken(String token) {
this.token = token;
}
public void setOrg(String org) {
this.org = org;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
}
yaml配置
influx2:
url: http://localhost:8086
org: aaaa
token: x8bpTR_-7cUt36-uSIDXTL0-plF6qOto8nHpPcHxTL6rglRzg1OxS4LKAawKJKhtvs1PS6eJL7XRh90i2yzeWw==
# loaddata web-ui 上可以查询
bucket: aaaa
influxql 查询数据, 行协议写入数据代码
package io.geekidea.boot.rador.service.influxdb;
import com.influxdb.client.*;
import com.influxdb.client.domain.InfluxQLQuery;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.influxdb.query.InfluxQLQueryResult;
import com.mysql.cj.QueryResult;
import com.mysql.cj.xdevapi.InsertParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
@Service
public class InfluxdbHandler {
@Autowired
private InfluxDBClient dbclient;
/**
*
* 数据结构参考 radar,x=3,y=4 longitude=1,latitude=2,deformation=3,strength=5 时间
* 实际生产环境不能操作100万个点
*/
public void writLineProtacal(ArrayList<double[]> doubleList) {
doubleList = new ArrayList<>(); // 存储到数据库的结构 每行有6个点
// 经度 纬度 x y deformation形变 strength强度
testdataCreate(doubleList);
try(WriteApi writeApi = dbclient.makeWriteApi()) {
StringBuilder buf = new StringBuilder();
Long current = System.currentTimeMillis() ;
String linesplit = "\n";
long nanos = System. currentTimeMillis() * 1_000_000 ; // 和北京时间对齐
for (double[] doubles : doubleList) {
buf.append(String.format("radar x=%f,y=%f,lon=%f,lat=%f,defor=%f,stren=%f "
,doubles[2], doubles[3],doubles[0],doubles[1],doubles[4],doubles[5] ) )
.append(nanos).append(linesplit);
nanos = nanos + 1;
}
long starttime = System.currentTimeMillis();
// System.out.println(buf);
// 以纳秒写入
writeApi.writeRecord(WritePrecision.NS,buf.toString());
long endtime = System.currentTimeMillis();
System.out.println("写入耗时:" + (endtime - starttime) );
//System.out.println(buf.toString());
}
}
/**
* 产生测试数据生产关闭
* @param doubleList
*/
private static void testdataCreate(ArrayList<double[]> doubleList) {
Random random = new Random();
for (int i = 0; i < 400000; i++) {
double[] array = new double[6];
for (int j = 0; j < 6; j++) {
if(j == 2 ){
array[j] = i ;
} else if(j == 3 ){
array[j] = i+1 ;
}else{
array[j] = random.nextDouble();
}
}
doubleList.add(array);
}
// 打印数据列表
/*for (double[] array : doubleList) {
for (double value : array) {
System.out.print(value + " ");
}
System.out.println();
}*/
}
/**
* 计算 形变 ,速度 和加速度
* @param starttime
* @param endtime
* @param x
* @param y
*/
public void calculateDefor(long starttime ,long endtime ,float x ,float y ){
//
// Query data
//
String influxQL = " SELECT time,defor,lat,lon, stren, x, y FROM \"radar\" WHERE time >= now() - 3d AND x = 999959 AND y = 999960 ";
String deforSql = "";
String speedSql = "";
// String.format("%d", longValue); String.format("%.6f" 浮点 6位小数
InfluxQLQueryApi queryApi = dbclient.getInfluxQLQueryApi();
// send request
InfluxQLQueryResult result = queryApi.query(new InfluxQLQuery(influxQL, "aaaa").setPrecision(InfluxQLQuery.InfluxQLPrecision.SECONDS),
(columnName, rawValue, resultIndex, seriesName) -> {
// convert columns
switch (columnName) {
case "time":
return Instant.ofEpochSecond(Long.parseLong(rawValue));
case "defor":
return Double.parseDouble(rawValue) ;
case "lat":
return Double.parseDouble(rawValue) ;
case "lon":
return Double.parseDouble(rawValue) ;
case "stren":
return Double.parseDouble(rawValue) ;
case "x":
return Double.parseDouble(rawValue) ;
case "y":
return Double.parseDouble(rawValue) ;
default:
throw new IllegalArgumentException("unexpected column " + columnName);
}
});
// 生产可以注释
for (InfluxQLQueryResult.Result resultResult : result.getResults()) {
for (InfluxQLQueryResult.Series series : resultResult.getSeries()) {
for (InfluxQLQueryResult.Series.Record record : series.getValues()) {
System.out.println(record.getValueByKey("time") + ": " + record.getValueByKey("defor") + ": " + record.getValueByKey("lat") + ": " + record.getValueByKey("lon") + ": " + record.getValueByKey("stren") + ": " + record.getValueByKey("x") + ": " + record.getValueByKey("y") );
}
}
}
}
}
查询非常慢30秒单机版,最终弃用 改为其他时序数据库,flux 按列查询,不如influxql好用。