使用 Java、Spring 和流数据库查询物化视图_数据库

物化视图是数据库管理系统中的强大工具,允许用户预先计算和存储查询结果,从而提高性能并减少昂贵的计算需求。然而,在现代快节奏的业务环境中,数据库中的数据可能会频繁变化,需要频繁更新物化视图。流数据库使我们能够持续实时地摄取和处理来自不同数据源的大量数据。在本文中,我们将探讨如何使用 Java、Spring 和流数据库(例如RisingWave)查询物化视图。

学习目标

您将在整篇文章中了解到以下内容:

  • 如何摄取 Kafka 主题并运行实时查询。
  • 如何使用流数据库创建物化视图。
  • 构建一个从物化视图读取和公开数据的 Java 应用程序。

推荐内容

在继续这篇文章之前,我强烈建议您还阅读我的其他文章,以了解流式数据库与传统数据库有何不同,为什么我们需要使用物化视图来查询微服务,以及如何使用 SQL 查询 Kafka 中的实时数据。

示例场景:分析订单交付绩效

对于任何在线销售产品的企业来说,订单交付绩效是一个至关重要的指标。它反映了订单履行流程的效率和有效性,并直接影响客户满意度。为了分析订单交付绩效,企业需要跟踪关键绩效指标 (KPI),例如交付时间、订单准确性和交付成本。在本文的范围内,我们将创建一个使用 Java 和Spring Boot构建的示例订单交付应用程序(您可以在GitHub上找到源代码) ,并学习如何使用流数据库和物化视图来实时分析食品订单交付性能。

下面的架构图说明了整体数据流:

使用 Java、Spring 和流数据库查询物化视图_应用程序_02

  1. 我们有一个名为 Kafka 主题 delivery_orders ,其中包含食品配送网站上的每个订单的事件。每个事件都包含有关订单的信息,例如 order ID、 restaurant ID和 delivery status。工作负载生成器(称为 Datagen 的 Python 脚本)连续模拟随机模拟数据的生成,并将其流式传输到 Kafka 主题中。实际上,这些模拟数据可以替换为来自应用程序的数据。
  2. RisingWave 流数据库连接到 Kafka 代理并使用其Kafka 连接器读取 Kafka 主题。它还将数据从源保存到RisingWave 表中。
  3. RisingWave 允许我们使用 SQL 查询流数据,并且我们可以创建物化视图,通过减少昂贵的联接和计算的需要来针对复杂查询进行优化。当新的更改到来时,存储在物化视图中的数据将自动更新。
  4. 然后,我们从示例Spring boot Web API查询物化视图。

查询物化视图演示

假设我们有一个名为Restaurant_orders_view的物化视图,它实时计算过去 15 分钟内从不同餐厅创建的总订单数。现在我们的任务是将此物化视图结果作为订单服务中的API 端点/orders/count-total-restaurant-orders公开到. 在 Java 中,您可以使用 JDBC 查询物化视图,这是一种用于连接数据库的 Java API。此外,您可以利用 Spring 框架来简化使用 JDBC 的过程并构建 REST API。

由于 RisingWave 与PostgreSQL有线兼容,因此您可以使用 PostgreSQL JDBC 驱动程序连接到 RisingWave 并从 Java 应用程序与 RisingWave 交互。您还可以使用其他客户端的不同编程语言(NodeJS、Python和Go)的库。

接下来的部分将向您展示在 Java 和 Spring 中查询物化视图的分步指南。

在你开始之前

本教程包括设置两个项目:

  • 我们将在本地环境中启动 GitHub 上现有的 RisingWave 全功能演示集群,该集群由多个 RisingWave 组件组成。为了简化此任务,它利用docker-compose.yaml文件,其中包括用于 Kafka 消息代理和数据生成服务的附加容器。
  • Spring boot应用程序,一个具有必要依赖项的Maven项目,我们也将在本地运行它。

要完成本教程,您需要具备以下条件:

  • 确保 您的环境中安装了Docker 和 Docker Compose  。
  • 确保 您的环境中安装了PostgreSQL 交互式终端 psql。有关详细说明,请参阅 下载 PostgreSQL
  • Java 11 SDK或更高版本。
  • 您最喜欢的编辑器,就我而言,我使用Intellij Idea。

第 1 步:设置演示集群

首先,将 RisingWave 存储库克隆到本地环境。

git clone https://github.com/risingwavelabs/risingwave.git


然后,导航到该 目录并从docker compose 文件integration_tests/delivery 启动演示集群 。

cd risingwave/integration_tests/delivery
docker compose up -d


确保所有容器都已启动并正在运行!

步骤2:复制并打开Spring Boot应用程序。

设置流数据库后,我们将运行 Spring Boot 应用程序。另外,分叉/克隆该项目并在 Java 编辑器中打开它。

git clone https://github.com/Boburmirzo/risingwave-java-spring.git


第三步:安装项目。

然后mvn clean install从项目根文件夹执行。在mavenpom.xml文件中,我们将postgresql依赖项和spring-boot-starter-jdbc驱动程序依赖项添加到我们的项目中。这些依赖项将提供在 Spring 中使用 JDBC 所需的类和接口。

步骤 4:运行演示 RisingWave 应用程序。

现在我们可以从编辑器运行我们的主DemoRisingWaveApplication.java 。运行应用程序后,您可以访问端口上的端点8080或在浏览器上打开此 URL。http://localhost:8080/orders/count-total-restaurant-orders。您将从 RisingWave 获得物化视图响应。

[["2023-05-06T05:28:00.000+00:00",1,1],["2023-05-06T05:33:00.000+00:00",1,3...]]


分解项目文件

让我们分解项目中的一些重要文件来了解每个角色。

连接到 RisingWave

要在 Spring Boot 应用程序中查询物化视图,首先需要通过配置 Spring Boot application.yml文件来建立与流数据库的连接。本datasource节设置一个 PostgreSQL 数据库连接,其中 RisingWave 数据库 URL 为jdbc:postgresql://localhost:4566/dev(它指向dev在我们的 RisingWave 演示集群上运行的数据库)、用户名“root”和空密码。

server:
  port: 8080
spring:
  profiles:
    active: dev
  application:
    name: materialized-view-api
  datasource:
    url: jdbc:postgresql://localhost:4566/dev
    username: root
    password:
...


创建数据源和物化视图

接下来,在Startup.java文件中,我们有三个 SQL 语句,当 Spring Boot 应用程序启动时执行,以在 RisingWave 中创建一个作为 Kafka 的源,删除现有的物化视图,并通过从应用程序资源目录中的 view.json 文件(包含要创建的物化视图列表)读取此数据来创建新的物化视图例如,下面的 SQL 语句创建了一个在 RisingWave 流数据库中调用的表。该表有四列:、、和。delivery_orders_sourceorder_idrestaurant_idorder_stateorder_timestamp

public static final String CREATE_RISINGWAVE_SOURCE_TABLE = "CREATE TABLE IF NOT EXISTS delivery_orders_source (\n" +
        "    order_id BIGINT,\n" +
        "    restaurant_id BIGINT,\n" +
        "    order_state VARCHAR,\n" +
        "    order_timestamp TIMESTAMP\n" +
        ") WITH (\n" +
        "    connector = 'kafka',\n" +
        "    topic = 'delivery_orders',\n" +
        "    properties.bootstrap.server = 'message_queue:29092',\n" +
        "    scan.startup.mode = 'earliest'\n" +
        ") ROW FORMAT JSON;";


该语句还包括一个WITH为表指定附加选项的子句。在本例中,该connector选项设置为kafka,表示该表将连接到 Kafka 主题。该topic选项设置为delivery_orders,指定 Kafka 主题的名称。

使用 JdbcTemplate 查询物化视图

Spring 提供了许多功能来帮助您使用数据库,其中包括JdbcTemplate类,它简化了执行 SQL 语句和处理结果的过程。要在 Spring 中查询物化视图,您可以使用该类JdbcTemplate执行 SQL 查询,从物化视图中选择数据,然后从结果集中提取数据。

String createSql = String
    .format(CREATE_MATERIALIZED_VIEW, materializeView.getName(), materializeView.getQuery());
jdbcTemplate.execute(createSql);


使用 JPA 查询物化视图

创建物化视图后,还可以使用 Spring Data JPA 存储库在 Java 中对其进行查询。您可以创建一个名为 的新实体类,RestaurantOrdersView该实体类映射到 RisingWave 中物化视图表中的列。

@Entity
@Getter
@Setter
@Table(name = "restaurant_orders_view")
public class RestaurantOrdersView implements Serializable {

    @Id
    @Column(name = "restaurant_id")
    private Long restaurantId;

    @Column(name = "window_start")
    private Timestamp windowStart;

    @Column(name = "total_order")
    private BigInteger totalOrder;
}


有了实体类,我们就可以创建一个 Spring Data JPA 存储库,它允许我们使用标准 JPA 查询方法或者本机 SQL 查询来查询物化视图。例如,以下代码检索餐厅订单总数:

@Component
public class OrderDeliveryRepositoryImpl implements OrderDeliveryRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<RestaurantOrdersView> countTotalRestaurantOrders() {
        Query query = entityManager.createNativeQuery("SELECT * FROM restaurant_orders_view WHERE restaurant_id = 1");
        return query.getResultList();
    }
}


countTotalRestaurantOrders然后可以从我们的应用程序中调用此方法OrderDeliveryService,我们可以添加额外的业务逻辑并将其传递OrderDeliveryController给 REST 端点,以便使该数据可用。

@RestController
@RequiredArgsConstructor
@RequestMapping("/orders")
@CrossOrigin(value = "*", allowedHeaders = "*")
public class OrderDeliveryController {

    private final OrderDeliveryService orderDeliveryService;

    @GetMapping("/count-total-restaurant-orders")
    @CrossOrigin(value = "*", allowedHeaders = "*")
    public List<RestaurantOrdersView> getCountTotalRestaurantOrders() {
        return orderDeliveryService.countTotalRestaurantOrders();
    }
}


结论

总之,使用流数据库,我们可以实时从一个或多个数据源获取流数据,可以合并多个流并创建物化视图。Spring Boot 提供了与流行数据源(例如流数据库)集成的内置支持。我们已经看到企业如何使用流数据库、Java 和 Spring 实时分析订单交付性能,从而使他们能够识别瓶颈并提高订单履行流程的效率和有效性。

物化视图是数据库管理系统中的强大工具,允许用户预先计算和存储查询结果,从而提高性能并减少昂贵的计算需求。然而,在现代快节奏的业务环境中,数据库中的数据可能会频繁变化,需要频繁更新物化视图。流数据库使我们能够持续实时地摄取和处理来自不同数据源的大量数据。在本文中,我们将探讨如何使用 Java、Spring 和流数据库(例如RisingWave)查询物化视图。

学习目标

您将在整篇文章中了解到以下内容:

  • 如何摄取 Kafka 主题并运行实时查询。
  • 如何使用流数据库创建物化视图。
  • 构建一个从物化视图读取和公开数据的 Java 应用程序。

推荐内容

在继续这篇文章之前,我强烈建议您还阅读我的其他文章,以了解流式数据库与传统数据库有何不同,为什么我们需要使用物化视图来查询微服务,以及如何使用 SQL 查询 Kafka 中的实时数据。

示例场景:分析订单交付绩效

对于任何在线销售产品的企业来说,订单交付绩效是一个至关重要的指标。它反映了订单履行流程的效率和有效性,并直接影响客户满意度。为了分析订单交付绩效,企业需要跟踪关键绩效指标 (KPI),例如交付时间、订单准确性和交付成本。在本文的范围内,我们将创建一个使用 Java 和Spring Boot构建的示例订单交付应用程序(您可以在GitHub上找到源代码) ,并学习如何使用流数据库和物化视图来实时分析食品订单交付性能。

下面的架构图说明了整体数据流:

使用 Java、Spring 和流数据库查询物化视图_物化视图_03

  1. 我们有一个名为 Kafka 主题 delivery_orders ,其中包含食品配送网站上的每个订单的事件。每个事件都包含有关订单的信息,例如 order ID、 restaurant ID和 delivery status。工作负载生成器(称为 Datagen 的 Python 脚本)连续模拟随机模拟数据的生成,并将其流式传输到 Kafka 主题中。实际上,这些模拟数据可以替换为来自应用程序的数据。
  2. RisingWave 流数据库连接到 Kafka 代理并使用其Kafka 连接器读取 Kafka 主题。它还将数据从源保存到RisingWave 表中。
  3. RisingWave 允许我们使用 SQL 查询流数据,并且我们可以创建物化视图,通过减少昂贵的联接和计算的需要来针对复杂查询进行优化。当新的更改到来时,存储在物化视图中的数据将自动更新。
  4. 然后,我们从示例Spring boot Web API查询物化视图。

查询物化视图演示

假设我们有一个名为Restaurant_orders_view的物化视图,它实时计算过去 15 分钟内从不同餐厅创建的总订单数。现在我们的任务是将此物化视图结果作为订单服务中的API 端点/orders/count-total-restaurant-orders公开到. 在 Java 中,您可以使用 JDBC 查询物化视图,这是一种用于连接数据库的 Java API。此外,您可以利用 Spring 框架来简化使用 JDBC 的过程并构建 REST API。

由于 RisingWave 与PostgreSQL有线兼容,因此您可以使用 PostgreSQL JDBC 驱动程序连接到 RisingWave 并从 Java 应用程序与 RisingWave 交互。您还可以使用其他客户端的不同编程语言(NodeJS、Python和Go)的库。

接下来的部分将向您展示在 Java 和 Spring 中查询物化视图的分步指南。

在你开始之前

本教程包括设置两个项目:

  • 我们将在本地环境中启动 GitHub 上现有的 RisingWave 全功能演示集群,该集群由多个 RisingWave 组件组成。为了简化此任务,它利用docker-compose.yaml文件,其中包括用于 Kafka 消息代理和数据生成服务的附加容器。
  • Spring boot应用程序,一个具有必要依赖项的Maven项目,我们也将在本地运行它。

要完成本教程,您需要具备以下条件:

  • 确保 您的环境中安装了Docker 和 Docker Compose  。
  • 确保 您的环境中安装了PostgreSQL 交互式终端 psql。有关详细说明,请参阅 下载 PostgreSQL
  • Java 11 SDK或更高版本。
  • 您最喜欢的编辑器,就我而言,我使用Intellij Idea。

第 1 步:设置演示集群

首先,将 RisingWave 存储库克隆到本地环境。

git clone https://github.com/risingwavelabs/risingwave.git


然后,导航到该 目录并从docker compose 文件integration_tests/delivery 启动演示集群 。

cd risingwave/integration_tests/delivery
docker compose up -d


确保所有容器都已启动并正在运行!

步骤2:复制并打开Spring Boot应用程序。

设置流数据库后,我们将运行 Spring Boot 应用程序。另外,分叉/克隆该项目并在 Java 编辑器中打开它。

git clone https://github.com/Boburmirzo/risingwave-java-spring.git


第三步:安装项目。

然后mvn clean install从项目根文件夹执行。在mavenpom.xml文件中,我们将postgresql依赖项和spring-boot-starter-jdbc驱动程序依赖项添加到我们的项目中。这些依赖项将提供在 Spring 中使用 JDBC 所需的类和接口。

步骤 4:运行演示 RisingWave 应用程序。

现在我们可以从编辑器运行我们的主DemoRisingWaveApplication.java 。运行应用程序后,您可以访问端口上的端点8080或在浏览器上打开此 URL。http://localhost:8080/orders/count-total-restaurant-orders。您将从 RisingWave 获得物化视图响应。

[["2023-05-06T05:28:00.000+00:00",1,1],["2023-05-06T05:33:00.000+00:00",1,3...]]


分解项目文件

让我们分解项目中的一些重要文件来了解每个角色。

连接到 RisingWave

要在 Spring Boot 应用程序中查询物化视图,首先需要通过配置 Spring Boot application.yml文件来建立与流数据库的连接。本datasource节设置一个 PostgreSQL 数据库连接,其中 RisingWave 数据库 URL 为jdbc:postgresql://localhost:4566/dev(它指向dev在我们的 RisingWave 演示集群上运行的数据库)、用户名“root”和空密码。

server:
  port: 8080
spring:
  profiles:
    active: dev
  application:
    name: materialized-view-api
  datasource:
    url: jdbc:postgresql://localhost:4566/dev
    username: root
    password:
...


创建数据源和物化视图

接下来,在Startup.java文件中,我们有三个 SQL 语句,当 Spring Boot 应用程序启动时执行,以在 RisingWave 中创建一个作为 Kafka 的源,删除现有的物化视图,并通过从应用程序资源目录中的 view.json 文件(包含要创建的物化视图列表)读取此数据来创建新的物化视图例如,下面的 SQL 语句创建了一个在 RisingWave 流数据库中调用的表。该表有四列:、、和。delivery_orders_sourceorder_idrestaurant_idorder_stateorder_timestamp

public static final String CREATE_RISINGWAVE_SOURCE_TABLE = "CREATE TABLE IF NOT EXISTS delivery_orders_source (\n" +
        "    order_id BIGINT,\n" +
        "    restaurant_id BIGINT,\n" +
        "    order_state VARCHAR,\n" +
        "    order_timestamp TIMESTAMP\n" +
        ") WITH (\n" +
        "    connector = 'kafka',\n" +
        "    topic = 'delivery_orders',\n" +
        "    properties.bootstrap.server = 'message_queue:29092',\n" +
        "    scan.startup.mode = 'earliest'\n" +
        ") ROW FORMAT JSON;";


该语句还包括一个WITH为表指定附加选项的子句。在本例中,该connector选项设置为kafka,表示该表将连接到 Kafka 主题。该topic选项设置为delivery_orders,指定 Kafka 主题的名称。

使用 JdbcTemplate 查询物化视图

Spring 提供了许多功能来帮助您使用数据库,其中包括JdbcTemplate类,它简化了执行 SQL 语句和处理结果的过程。要在 Spring 中查询物化视图,您可以使用该类JdbcTemplate执行 SQL 查询,从物化视图中选择数据,然后从结果集中提取数据。

String createSql = String
    .format(CREATE_MATERIALIZED_VIEW, materializeView.getName(), materializeView.getQuery());
jdbcTemplate.execute(createSql);


使用 JPA 查询物化视图

创建物化视图后,还可以使用 Spring Data JPA 存储库在 Java 中对其进行查询。您可以创建一个名为 的新实体类,RestaurantOrdersView该实体类映射到 RisingWave 中物化视图表中的列。

@Entity
@Getter
@Setter
@Table(name = "restaurant_orders_view")
public class RestaurantOrdersView implements Serializable {

    @Id
    @Column(name = "restaurant_id")
    private Long restaurantId;

    @Column(name = "window_start")
    private Timestamp windowStart;

    @Column(name = "total_order")
    private BigInteger totalOrder;
}


有了实体类,我们就可以创建一个 Spring Data JPA 存储库,它允许我们使用标准 JPA 查询方法或者本机 SQL 查询来查询物化视图。例如,以下代码检索餐厅订单总数:

@Component
public class OrderDeliveryRepositoryImpl implements OrderDeliveryRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<RestaurantOrdersView> countTotalRestaurantOrders() {
        Query query = entityManager.createNativeQuery("SELECT * FROM restaurant_orders_view WHERE restaurant_id = 1");
        return query.getResultList();
    }
}


countTotalRestaurantOrders然后可以从我们的应用程序中调用此方法OrderDeliveryService,我们可以添加额外的业务逻辑并将其传递OrderDeliveryController给 REST 端点,以便使该数据可用。

@RestController
@RequiredArgsConstructor
@RequestMapping("/orders")
@CrossOrigin(value = "*", allowedHeaders = "*")
public class OrderDeliveryController {

    private final OrderDeliveryService orderDeliveryService;

    @GetMapping("/count-total-restaurant-orders")
    @CrossOrigin(value = "*", allowedHeaders = "*")
    public List<RestaurantOrdersView> getCountTotalRestaurantOrders() {
        return orderDeliveryService.countTotalRestaurantOrders();
    }
}


结论

总之,使用流数据库,我们可以实时从一个或多个数据源获取流数据,可以合并多个流并创建物化视图。Spring Boot 提供了与流行数据源(例如流数据库)集成的内置支持。我们已经看到企业如何使用流数据库、Java 和 Spring 实时分析订单交付性能,从而使他们能够识别瓶颈并提高订单履行流程的效率和有效性。

物化视图是数据库管理系统中的强大工具,允许用户预先计算和存储查询结果,从而提高性能并减少昂贵的计算需求。然而,在现代快节奏的业务环境中,数据库中的数据可能会频繁变化,需要频繁更新物化视图。流数据库使我们能够持续实时地摄取和处理来自不同数据源的大量数据。在本文中,我们将探讨如何使用 Java、Spring 和流数据库(例如RisingWave)查询物化视图。

学习目标

您将在整篇文章中了解到以下内容:

  • 如何摄取 Kafka 主题并运行实时查询。
  • 如何使用流数据库创建物化视图。
  • 构建一个从物化视图读取和公开数据的 Java 应用程序。

推荐内容

在继续这篇文章之前,我强烈建议您还阅读我的其他文章,以了解流式数据库与传统数据库有何不同,为什么我们需要使用物化视图来查询微服务,以及如何使用 SQL 查询 Kafka 中的实时数据。

示例场景:分析订单交付绩效

对于任何在线销售产品的企业来说,订单交付绩效是一个至关重要的指标。它反映了订单履行流程的效率和有效性,并直接影响客户满意度。为了分析订单交付绩效,企业需要跟踪关键绩效指标 (KPI),例如交付时间、订单准确性和交付成本。在本文的范围内,我们将创建一个使用 Java 和Spring Boot构建的示例订单交付应用程序(您可以在GitHub上找到源代码) ,并学习如何使用流数据库和物化视图来实时分析食品订单交付性能。

下面的架构图说明了整体数据流:

使用 Java、Spring 和流数据库查询物化视图_数据库_04

  1. 我们有一个名为 Kafka 主题 delivery_orders ,其中包含食品配送网站上的每个订单的事件。每个事件都包含有关订单的信息,例如 order ID、 restaurant ID和 delivery status。工作负载生成器(称为 Datagen 的 Python 脚本)连续模拟随机模拟数据的生成,并将其流式传输到 Kafka 主题中。实际上,这些模拟数据可以替换为来自应用程序的数据。
  2. RisingWave 流数据库连接到 Kafka 代理并使用其Kafka 连接器读取 Kafka 主题。它还将数据从源保存到RisingWave 表中。
  3. RisingWave 允许我们使用 SQL 查询流数据,并且我们可以创建物化视图,通过减少昂贵的联接和计算的需要来针对复杂查询进行优化。当新的更改到来时,存储在物化视图中的数据将自动更新。
  4. 然后,我们从示例Spring boot Web API查询物化视图。

查询物化视图演示

假设我们有一个名为Restaurant_orders_view的物化视图,它实时计算过去 15 分钟内从不同餐厅创建的总订单数。现在我们的任务是将此物化视图结果作为订单服务中的API 端点/orders/count-total-restaurant-orders公开到. 在 Java 中,您可以使用 JDBC 查询物化视图,这是一种用于连接数据库的 Java API。此外,您可以利用 Spring 框架来简化使用 JDBC 的过程并构建 REST API。

由于 RisingWave 与PostgreSQL有线兼容,因此您可以使用 PostgreSQL JDBC 驱动程序连接到 RisingWave 并从 Java 应用程序与 RisingWave 交互。您还可以使用其他客户端的不同编程语言(NodeJS、Python和Go)的库。

接下来的部分将向您展示在 Java 和 Spring 中查询物化视图的分步指南。

在你开始之前

本教程包括设置两个项目:

  • 我们将在本地环境中启动 GitHub 上现有的 RisingWave 全功能演示集群,该集群由多个 RisingWave 组件组成。为了简化此任务,它利用docker-compose.yaml文件,其中包括用于 Kafka 消息代理和数据生成服务的附加容器。
  • Spring boot应用程序,一个具有必要依赖项的Maven项目,我们也将在本地运行它。

要完成本教程,您需要具备以下条件:

  • 确保 您的环境中安装了Docker 和 Docker Compose  。
  • 确保 您的环境中安装了PostgreSQL 交互式终端 psql。有关详细说明,请参阅 下载 PostgreSQL
  • Java 11 SDK或更高版本。
  • 您最喜欢的编辑器,就我而言,我使用Intellij Idea。

第 1 步:设置演示集群

首先,将 RisingWave 存储库克隆到本地环境。

git clone https://github.com/risingwavelabs/risingwave.git


然后,导航到该 目录并从docker compose 文件integration_tests/delivery 启动演示集群 。

cd risingwave/integration_tests/delivery
docker compose up -d


确保所有容器都已启动并正在运行!

步骤2:复制并打开Spring Boot应用程序。

设置流数据库后,我们将运行 Spring Boot 应用程序。另外,分叉/克隆该项目并在 Java 编辑器中打开它。

git clone https://github.com/Boburmirzo/risingwave-java-spring.git


第三步:安装项目。

然后mvn clean install从项目根文件夹执行。在mavenpom.xml文件中,我们将postgresql依赖项和spring-boot-starter-jdbc驱动程序依赖项添加到我们的项目中。这些依赖项将提供在 Spring 中使用 JDBC 所需的类和接口。

步骤 4:运行演示 RisingWave 应用程序。

现在我们可以从编辑器运行我们的主DemoRisingWaveApplication.java 。运行应用程序后,您可以访问端口上的端点8080或在浏览器上打开此 URL。http://localhost:8080/orders/count-total-restaurant-orders。您将从 RisingWave 获得物化视图响应。

[["2023-05-06T05:28:00.000+00:00",1,1],["2023-05-06T05:33:00.000+00:00",1,3...]]


分解项目文件

让我们分解项目中的一些重要文件来了解每个角色。

连接到 RisingWave

要在 Spring Boot 应用程序中查询物化视图,首先需要通过配置 Spring Boot application.yml文件来建立与流数据库的连接。本datasource节设置一个 PostgreSQL 数据库连接,其中 RisingWave 数据库 URL 为jdbc:postgresql://localhost:4566/dev(它指向dev在我们的 RisingWave 演示集群上运行的数据库)、用户名“root”和空密码。

server:
  port: 8080
spring:
  profiles:
    active: dev
  application:
    name: materialized-view-api
  datasource:
    url: jdbc:postgresql://localhost:4566/dev
    username: root
    password:
...


创建数据源和物化视图

接下来,在Startup.java文件中,我们有三个 SQL 语句,当 Spring Boot 应用程序启动时执行,以在 RisingWave 中创建一个作为 Kafka 的源,删除现有的物化视图,并通过从应用程序资源目录中的 view.json 文件(包含要创建的物化视图列表)读取此数据来创建新的物化视图例如,下面的 SQL 语句创建了一个在 RisingWave 流数据库中调用的表。该表有四列:、、和。delivery_orders_sourceorder_idrestaurant_idorder_stateorder_timestamp

public static final String CREATE_RISINGWAVE_SOURCE_TABLE = "CREATE TABLE IF NOT EXISTS delivery_orders_source (\n" +
        "    order_id BIGINT,\n" +
        "    restaurant_id BIGINT,\n" +
        "    order_state VARCHAR,\n" +
        "    order_timestamp TIMESTAMP\n" +
        ") WITH (\n" +
        "    connector = 'kafka',\n" +
        "    topic = 'delivery_orders',\n" +
        "    properties.bootstrap.server = 'message_queue:29092',\n" +
        "    scan.startup.mode = 'earliest'\n" +
        ") ROW FORMAT JSON;";


该语句还包括一个WITH为表指定附加选项的子句。在本例中,该connector选项设置为kafka,表示该表将连接到 Kafka 主题。该topic选项设置为delivery_orders,指定 Kafka 主题的名称。

使用 JdbcTemplate 查询物化视图

Spring 提供了许多功能来帮助您使用数据库,其中包括JdbcTemplate类,它简化了执行 SQL 语句和处理结果的过程。要在 Spring 中查询物化视图,您可以使用该类JdbcTemplate执行 SQL 查询,从物化视图中选择数据,然后从结果集中提取数据。

String createSql = String
    .format(CREATE_MATERIALIZED_VIEW, materializeView.getName(), materializeView.getQuery());
jdbcTemplate.execute(createSql);


使用 JPA 查询物化视图

创建物化视图后,还可以使用 Spring Data JPA 存储库在 Java 中对其进行查询。您可以创建一个名为 的新实体类,RestaurantOrdersView该实体类映射到 RisingWave 中物化视图表中的列。

@Entity
@Getter
@Setter
@Table(name = "restaurant_orders_view")
public class RestaurantOrdersView implements Serializable {

    @Id
    @Column(name = "restaurant_id")
    private Long restaurantId;

    @Column(name = "window_start")
    private Timestamp windowStart;

    @Column(name = "total_order")
    private BigInteger totalOrder;
}


有了实体类,我们就可以创建一个 Spring Data JPA 存储库,它允许我们使用标准 JPA 查询方法或者本机 SQL 查询来查询物化视图。例如,以下代码检索餐厅订单总数:

@Component
public class OrderDeliveryRepositoryImpl implements OrderDeliveryRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<RestaurantOrdersView> countTotalRestaurantOrders() {
        Query query = entityManager.createNativeQuery("SELECT * FROM restaurant_orders_view WHERE restaurant_id = 1");
        return query.getResultList();
    }
}


countTotalRestaurantOrders然后可以从我们的应用程序中调用此方法OrderDeliveryService,我们可以添加额外的业务逻辑并将其传递OrderDeliveryController给 REST 端点,以便使该数据可用。

@RestController
@RequiredArgsConstructor
@RequestMapping("/orders")
@CrossOrigin(value = "*", allowedHeaders = "*")
public class OrderDeliveryController {

    private final OrderDeliveryService orderDeliveryService;

    @GetMapping("/count-total-restaurant-orders")
    @CrossOrigin(value = "*", allowedHeaders = "*")
    public List<RestaurantOrdersView> getCountTotalRestaurantOrders() {
        return orderDeliveryService.countTotalRestaurantOrders();
    }
}


结论

总之,使用流数据库,我们可以实时从一个或多个数据源获取流数据,可以合并多个流并创建物化视图。Spring Boot 提供了与流行数据源(例如流数据库)集成的内置支持。我们已经看到企业如何使用流数据库、Java 和 Spring 实时分析订单交付性能,从而使他们能够识别瓶颈并提高订单履行流程的效率和有效性。