SpringBoot|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 中还未集成,如果需要可以看官方文档手动集成
【SpringBoot|SpringBoot 2 集成时序数据库 InfluxDB 的正确姿势】然后在 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|SpringBoot 2 集成时序数据库 InfluxDB 的正确姿势
文章图片

通过查看依赖树(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

至此再启动即可正常运行

    推荐阅读