标签:java indexing postgresql synchronization replication
问题
我正在为几十万种产品建立一个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以使用listen / notify.见related answer
生产者/消费者的位将更难.要在PostgreSQL中拥有多个崩溃安全并发使用者,您需要使用pg_try_advisory_lock(…)进行咨询锁定.如果你不需要并发消费者那么这很容易,你只需要SELECT … LIMIT 1 FOR一次更新一行.
希望9.4将包含一个更简单的方法来跳过具有FOR UPDATE的锁定行,因为它正在开发中.
标签:java,indexing,postgresql,synchronization,replication 来源: https://codeday.me/bug/20190612/1228233.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。