gpt4 book ai didi

java - 通知 postgres 对 java 应用程序的更改

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:32 24 4
gpt4 key购买 nike

问题

我正在为几十万个产品构建一个postgres 数据库。我将设置一个索引(Solr 或者可能是 ElasticSearch) 以缩短复杂搜索查询的查询时间。

现在的重点是如何让索引与数据库同步?

在过去,我有一种应用程序会定期轮询数据库以检查更新,但我会有一个过时的索引状态时间(从数据库更新到索引更新拉取)。

我更喜欢数据库会通知我的应用程序(java 应用程序)数据库中的某些内容已更改的解决方案,此时应用程序将决定是否需要索引更新与否。更准确地说,我会构建一种生产者和消费者结构,希望副本能收到来自 postgres 的通知,告知发生了一些变化,如果这与索引的数据相关,它就会存储在待办更新堆栈中。消费者将使用这个堆栈并构建要存储到索引中的文档。

可能的解决方案

一个解决方案是编写一种副本端点,其中应用程序将表现为一个用于从原始数据库复制数据的 postgres 实例。有人对这种方法有经验吗?

对于这个问题,我还有哪些其他解决方案?

最佳答案

Which other solution do I have for this problem?

使用LISTEN and NOTIFY告诉你的应用程序事情已经改变了。

您可以从触发器发送 NOTIFY,该触发器也记录队列表中的更改。

您需要一个 PgJDBC 连接,该连接已为您正在使用的事件发送了 LISTEN。如果您使用 SSL,它必须通过定期发送空查询 ("") 来轮询数据库;如果您不使用 SSL,这可以通过使用异步通知检查来避免。您需要从连接池中解包 Connection 对象,以便能够将基础连接转换为 PgConnection 以使用监听/通知。参见 related answer

生产者/消费者位会更难。要在 PostgreSQL 中拥有多个安全的并发消费者,您需要使用 pg_try_advisory_lock(...) 的建议锁定。如果您不需要并发消费者,那么很简单,您只需一次SELECT ... LIMIT 1 FOR UPDATE一行。

希望 9.4 将包含一种更简单的方法,可以使用 FOR UPDATE 跳过锁定的行,因为它正在开发中。

关于java - 通知 postgres 对 java 应用程序的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com