pvp*_*ran 3 postgresql spring-data spring-boot spring-data-r2dbc
我正在尝试 spring-data-r2dbc。我正在 Postgresql 上尝试这个。我之前尝试过 spring-data-mongodb-reactive 。我忍不住将两者进行比较。
我发现查询派生尚不支持。但我想知道是否有等效的@Tailable. 这样我就能实时收到数据库更改的通知。任何人都可以分享与此相关的任何代码示例吗?
我知道底层数据库应该支持这一点。我相信 Postgresql 确实使用逻辑解码支持这种事情(如果我错了,请纠正我)。
@Tailablespring-data-r2dbc 中有等效的吗?
小智 6
我遇到了同样的问题,不确定您是否找到了解决方案,但我能够通过执行以下操作来完成类似的事情。首先,我将触发器添加到表中
CREATE TRIGGER trigger_name
AFTER INSERT OR DELETE OR UPDATE
ON table_name
FOR EACH ROW
EXECUTE PROCEDURE trigger_function_name;
Run Code Online (Sandbox Code Playgroud)
每当更新、删除或插入一行时,这都会在表上设置一个触发器。然后它将调用我设置的触发函数,如下所示:
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$;
Run Code Online (Sandbox Code Playgroud)
这将允许我“监听”我的 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());
}
}
Run Code Online (Sandbox Code Playgroud)
这样,我将其自动装配(依赖注入)到我的服务类中的构造函数中,并将其转换为 r2dbc PostgressqlConnection 类,如下所示:
this.postgresqlConnection = Mono.from(connectionFactory.create()).cast(PostgresqlConnection.class).block();
Run Code Online (Sandbox Code Playgroud)
现在我们想要“监听”我们的表并在对表执行某些更新时收到通知。为此,我们使用 @PostContruct 注释设置一个在依赖注入后执行的初始化方法
@PostConstruct
private void postConstruct() {
postgresqlConnection.createStatement("LISTEN notification_name").execute()
.flatMap(PostgresqlResult::getRowsUpdated).subscribe();
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们会监听 pg_notify 方法中输入的任何名称。另外,我们想设置一个方法来在 bean 即将被扔掉时关闭连接,如下所示:
@PreDestroy
private void preDestroy() {
postgresqlConnection.close().subscribe();
}
Run Code Online (Sandbox Code Playgroud)
现在,我只需创建一个方法,返回表中当前内容的 Flux,并将其与我的通知合并,正如我在通知以 json 形式传入之前所说的那样,所以我必须反序列化它,并决定使用对象映射器。所以,它看起来像这样:
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());
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。干杯!
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |