版本
- SpringBoot 2.5.7
- InfluxDB 1.8
前置知识
时序数据库对时间条件做了特殊优化,使其查询性能很高,项目中需要对设备的 GPS 轨迹信息做历史查询,这是典型的 时序数据
。
集成之前先对 InfluxDB
中的一些概念跟传统的 MySQL 做下对应:
MySQL | InfluxDB |
---|---|
Database | Database |
Table | Measurement |
Column | Field |
InfluxDB 中还有些特有的概念:
- Tag:类似 Field,但 Field 不会被索引,Tag 会
- Point:对应一条数据
- Series:一条数据中所有 Tag 数据的键值对
开始集成
SpringBoot 中 bom 默认已集成 InfluxDB 驱动和 AutoConfigure
相关配置,直接在项目 pom.xml
中添加依赖即可,不用写 version
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
</dependency>
驱动适用于 InfluxDB 1.x 版本,要注意版本对应,InfluxDB 2.x 版本驱动坐标换了,SpringBoot 中还未集成,如果需要可以看官方文档手动集成
然后在 application.yml
中配置连接信息
spring:
influx:
url: http://127.0.0.1:8086
user: ml
password: 56235623
由于 SpringBoot 中已有针对 InfluxDB Bean 的自动装配配置,在检测到项目中配置了 influx 配置后就会自动装配,所以在代码中直接注入 Bean 就好
@RequiredArgsConstructor
class TestService {
private final InfluxDB influxDB;
public void test() {
// 先构造 Point 对象
Point point = Point.measurement("position")
.tag("location", positionMqttVO.getAssetId().toString())
.addField("lng", positionMqttVO.getLng())
.addField("lat", positionMqttVO.getLat())
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.build();
// 写入
influxDB
.setDatabase("ame")
.write(point);
}
}
此时如果直接启动项目,会报一个错误提示
Caused by: java.lang.NoSuchFieldError: Companion
at okhttp3.internal.Util.<clinit>(Util.kt:70) ~[okhttp-4.9.3.jar:na]
at okhttp3.internal.concurrent.TaskRunner.<clinit>(TaskRunner.kt:309) ~[okhttp-4.9.3.jar:na]
at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:41) ~[okhttp-4.9.3.jar:na]
at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:47) ~[okhttp-4.9.3.jar:na]
at okhttp3.OkHttpClient$Builder.<init>(OkHttpClient.kt:471) ~[okhttp-4.9.3.jar:na]
at org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration.determineBuilder(InfluxDbAutoConfiguration.java:60) ~[spring-boot-autoconfigure-2.5.7.jar:2.5.7]
at org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration.influxDb(InfluxDbAutoConfiguration.java:51) ~[spring-boot-autoconfigure-2.5.7.jar:2.5.7]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.13.jar:5.3.13]
... 65 common frames omitted
通过查看依赖树(mvn dependency:tree -U
)可知这是由于 InfluxDB 驱动中集成的 OKHttp 版本太旧导致的,我们需要排除依赖并引入最新的 OKhttp
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>4.9.3</version>
</dependency>
至此再启动即可正常运行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。