缓存失效Postgres NOTIFY vs. polling

时间:2014-03-12 12:51:55

标签: java postgresql caching jdbc

我们有一个Java应用程序,可以从Postgres数据库中缓存所有信息(7个表中的约5000个条目)。问题是数据库在外部更新,缓存需要知道何时无效。需要注意的是,我们并不期望有很多插入/更新。

Postgres通过插入/更新的Listen / Notify和Trigger为此提供了一个很好的解决方案;唯一的问题是Postgres的JDBC驱动程序does not know to listen on notifications是异步的并且需要轮询并且没有找到从Java异步监听的解决方案。

问题是如何在这种情况下设计缓存更新触发,以实现最佳性能并限制缓存不一致的时间量。上述机制是否值得(为每个表创建触发器,然后为通知分隔通道以进行监听/通知和轮询通知),或者创建像select * from table where update_timestamp > ?这样的查询并且给出的参数是快速的最新的缓存更新时间戳(假设该列已编入索引)。

简单来说,是通过polling值得通知/收听还是更快地查询?

2 个答案:

答案 0 :(得分:3)

取决于通知频率。如果你每秒得到100个通知,它可能会“慢”(=需要更多CPU资源)然后轮询,因为你有更多的OS上下文切换。

答案 1 :(得分:1)

对于异步通知,请转到pgjdbc-ng 0.6驱动程序。

http://impossibl.github.io/pgjdbc-ng/

它支持异步通知,无需轮询。