1. 概述

在这个教程中,我们将简要介绍QuestDB,一个专为时序和事件数据设计的关系列式数据库。然后,我们将学习如何从Java应用向数据库发送数据。

2. 什么是QuestDB?

QuestDB是一个快速的开源时序数据库,具有高性能的数据摄入和SQL分析能力。简而言之,QuestDB解决了处理高吞吐量时间相关数据时的挑战,并通过简单的SQL查询轻松分析摄入的数据。

它兼容InfluxDB行协议、PostgreSQL wire协议和HTTP REST API。此外,它还有一个美观的Web控制台应用,我们可以直接与数据库交互。然而,我们将主要关注InfluxDB行协议,这是一种文本格式,每个数据点包含测量值、标签、字段和时间戳。在这种情况下,我们将使用一个易于使用的Java客户端库来发送数据,并抽象掉大部分细节。

QuestDB的一些优点包括:

  • 使用简单,性能高
  • 以关系模型处理时序数据
  • 数据摄入非常可扩展
  • 提供即时一致性

接下来,我们将使用Docker容器创建本地数据库实例。或者,我们也可以选择在云中付费获取完全管理的实例,无需维护。

3. 安装

让我们开始使用Docker安装容器化版本:

$ docker run -p 9000:9000 \
  -p 9009:9009 \
  -p 8812:8812 \
  -p 9003:9003 \
  -v "$(pwd):/var/lib/questdb" \
  -d --name questdb questdb/questdb:7.0.0

这将在我们的机器上创建一个QuestDB的本地实例。检查其是否运行,可以访问在端口9000上暴露的Web应用程序:

另外,QuestDB还提供了9003端口上的一个端点,用于检查数据库的健康状况。

4. 在Java项目中使用QuestDB

4.1. 连接到数据库

首先,我们需要在应用中与数据库通信。为此,QuestDB提供了几种连接方法,这些方法通过以下端口提供:

例如,我们将只使用推荐的InfluxDB行协议,并使用Java客户端来插入数据:

<dependency>
    <groupId>org.questdb</groupId>
    <artifactId>questdb</artifactId>
    <version>7.0.0</version>
</dependency>

然后,我们将向数据库发送一些数据。

4.2. 发送数据

简而言之,我们想建立一个温度追踪系统,将数据发送到sensors表。因此,我们需要创建一个Sender对象,将数据库的正确地址提供给构建器:

Sender sender = Sender.builder().address("localhost:9009").build();

Sender是可关闭的,所以我们使用它在一个try-with-resources构造中。

然后,我们可以引用sensors表,只需提供每个列的值即可简单地添加数据:

sender.table(SENSORS_TABLE_NAME)
    .stringColumn("id", "KTC")
    .stringColumn("name", "Kitchen temperature (Celsius)")
    .doubleColumn("currentValue", 20)
    .atNow();

特别地,我们不需要事先创建表,因为库会根据我们发送到数据库的数据自动生成表结构。

4.3. 查询数据

一旦我们有了数据,就可以在Web应用程序上使用SELECT语句查询数据。例如,我们可以使用以下方式查看厨房传感器的读数:

SELECT * from 'sensors' WHERE id = 'KTC'

在Web应用程序中可以看到这个结果:查询数据

4.4. 删除行

QuestDB不允许删除单行数据,但可以通过创建一个不包含所需行的表的副本,删除原始表,然后重命名副本为原始表名的方式来绕过这个限制。尽管这是可能的,但我们建议如果可能的话避免这样做,因为它成本较高。

5. 总结

在这篇文章中,我们了解了如何安装、连接、执行查询以及从我们的应用与QuestDB交互的方法。

本文的所有代码示例可以在GitHub上找到。