当前位置: 首页 > 知识库问答 >
问题:

@可扩展(spring-data-reactive-mongoDB)等效于spring-data-r2dbc

广亮
2023-03-14

我正在尝试spring-data-r2dbc。我正在Postgresql上尝试这个。我以前尝试过spring data mongodb Responsive。我忍不住把两者都比较了一下。

我看到还不支持查询派生。但我想知道是否有@Tailable的等价物。这样我就会实时收到数据库更改的通知。Ca任何人都可以共享与此相关的任何代码示例。

我理解底层数据库应该支持这一点。我相信Postgresql确实支持这种使用逻辑解码的方式(如果我在这里错了,请纠正我)。

spring-data-r2dbc中是否有@Tailable等效项?

共有1个答案

裴经义
2023-03-14

我也在同一个问题上,不确定您是否找到了解决方案,但我可以通过执行以下操作来完成类似的任务。首先,我在表中添加了触发器

CREATE TRIGGER trigger_name
    AFTER INSERT OR DELETE OR UPDATE 
    ON table_name
    FOR EACH ROW
    EXECUTE PROCEDURE trigger_function_name;

这将在更新、删除或插入行时在表上设置触发器。然后它将调用我设置的触发函数,该函数如下所示:

CREATE FUNCTION trigger_function_name
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS 
$BODY$
DECLARE
    payload JSON;
BEGIN
    payload = row_to_json(NEW);
    PERFORM pg_notify('notification_name', payload::text);
    RETURN NULL;
END;
$BODY$;

这将允许我“监听”来自我的Spring Boot项目的任何这些更新,它将作为有效负载发送整行。接下来,在我的Spring Boot项目中,我配置了与数据库的连接。

@Configuration
@EnableR2dbcRepositories("com.(point to wherever repository is)")
public class R2DBCConfig extends AbstractR2dbcConfiguration {
    @Override
    @Bean
    public ConnectionFactory connectionFactory() {
        return new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
                .host("host")
                .database("db")
                .port(port)
                .username("username")
                .password("password")
                .schema("schema")
                .connectTimeout(Duration.ofMinutes(2))
                .build());
    }
}

有了它,我将它Autowire(依赖注入)放入我的服务类中的构造函数中,并将其强制转换为r2dbc PostgressqlConnection类,如下所示:

this.postgresqlConnection = Mono.from(connectionFactory.create()).cast(PostgresqlConnection.class).block();

现在我们想“监听”我们的表并在对我们的表执行某些更新时收到通知。为此,我们设置了一个初始化方法,该方法在依赖注入后使用@PostContruct注释执行

@PostConstruct
private void postConstruct() {
    postgresqlConnection.createStatement("LISTEN notification_name").execute()
            .flatMap(PostgresqlResult::getRowsUpdated).subscribe();
}

请注意,我们监听我们放在pg_notify方法中的任何名称。我们还想设置一个方法来在bean即将被丢弃时关闭连接,如下所示:

@PreDestroy
private void preDestroy() {
    postgresqlConnection.close().subscribe();
}

现在,我只需创建一个方法,返回当前表中的任何内容的流量,并将其与通知合并,正如我在通知以json形式出现之前所说的,因此我必须对其进行反序列化,并决定使用ObjectMapper。所以,它看起来像这样:

private Flux<YourClass> getUpdatedRows() {
    return postgresqlConnection.getNotifications().map(notification -> {
        try {
            //deserialize json
            return objectMapper.readValue(notification.getParameter(), YourClass.class);
        } catch (IOException e) {
            //handle exception
        }
    });
}

public Flux<YourClass> getDocuments() {
    return documentRepository.findAll().share().concatWith(getUpdatedRows());
}

希望这有帮助。干杯

 类似资料:
  • 这一章将介绍如何把Spring Data扩展到其他的框架中。接下来让我们看看如何将Spring Data整合到Spring MVC中。

  • Spring Data MongoDB 可以提供 Java 开发人员在使用 MongoDB 时的效率。它使用了熟悉的 Spring 概念,例如用于核心 API 的模块类,轻量级仓库风格的数据访问。 Spring Data MongoDB 项目提供了集成 MongoDB 文档数据库。Spring Data MongoDB 的核心功能区是一个 POJO 中心模型,用于与 MongoDB DBColle

  • 我们有一个应用程序,它使用Spring数据JPA存储库注入EJB。springframework。数据jpa。存储库。cdi。JpaRepositoryExtension发挥了神奇的作用。 它在CDI中查找EntityManager,保存以备后用,使用注释查找Spring Data JPA存储库,并保存它们的类型以备后用。当CDI初始化时,运行并执行正确的bean创建和插入CDI。这在JBoss

  • 顺便说一句:当我将名为“insert”的属性添加到Goal或从Goal中删除elasticsearch注释时,该错误就会消失。 GoalRepository是:

  • 我知道有一个jackson kotlin模块,它包含在我的maven文件中。它用于反序列化我通过http获得的对象,所以我知道spring会接收它。然而,spring data mongodb似乎不使用jackson ObjectMapper? 有没有一种方法可以在spring data mongodb中使用jackson objectmapper,或者修复没有非args构造函数的问题?

  • 我使用的是spring数据mongodb。 我想通过在查询中传递一些可选参数来查询数据库。 我有一个域类。 我的控制器: 这里Key和username是可选的查询参数。 如果我通过其中任何一个,它应该返回具有给定密钥或用户名的匹配文档。 我的服务方式是: 存储库: 但是通过使用上述查询,它不会返回具有给定密钥或用户名的文档。我的查询有什么问题? 这就是我提出请求的方式http://localhos