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行协议:端口9009
- PostgreSQL wire协议:端口8812
- HTTP REST API:端口9000
- Web Console:端口9000
例如,我们将只使用推荐的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上找到。