SpringBoot 2 集成时序数据库 InfluxDB 的正确姿势

版本

  • 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


  org.influxdb
  influxdb-java

驱动适用于 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.(Util.kt:70) ~[okhttp-4.9.3.jar:na]
    at okhttp3.internal.concurrent.TaskRunner.(TaskRunner.kt:309) ~[okhttp-4.9.3.jar:na]
    at okhttp3.ConnectionPool.(ConnectionPool.kt:41) ~[okhttp-4.9.3.jar:na]
    at okhttp3.ConnectionPool.(ConnectionPool.kt:47) ~[okhttp-4.9.3.jar:na]
    at okhttp3.OkHttpClient$Builder.(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

SpringBoot 2 集成时序数据库 InfluxDB 的正确姿势_第1张图片

通过查看依赖树(mvn dependency:tree -U)可知这是由于 InfluxDB 驱动中集成的 OKHttp 版本太旧导致的,我们需要排除依赖并引入最新的 OKhttp


  org.influxdb
  influxdb-java
  
    
      com.squareup.okhttp3
      okhttp
    
    
      com.squareup.okhttp3
      logging-interceptor
    
  


  com.squareup.okhttp3
  okhttp
  4.9.3


  com.squareup.okhttp3
  logging-interceptor
  4.9.3

至此再启动即可正常运行

你可能感兴趣的:(SpringBoot 2 集成时序数据库 InfluxDB 的正确姿势)