我有一个 Java Web 应用程序(WAR 部署到 Tomcat),它在内存中保留一个缓存(Map<Long,Widget>
)。我有一个包含widgets
表的 Postgres 数据库:
widget_id | widget_name | widget_value
(INT) (VARCHAR 50) (INT)
Widget
为了POJO 和表记录之间的 O/R 映射widgets
,我使用的是 MyBatis。我想实现一个解决方案,只要表中的值发生变化,Java 缓存(地图)就会实时更新widgets
。我可以有一个轮询组件,例如每 30 秒检查一次表,但轮询在这里感觉不是正确的解决方案。所以这就是我的提议:
- 编写一个调用存储过程的 Postgres 触发器 (
run_cache_updater()
) - 该过程依次运行一个 shell 脚本 (
run_cache_updater.sh
) - 脚本 base-64 对更改
widgets
的记录进行编码,然后将编码的记录卷曲到 HTTP URL - Java WAR 有一个 servlet 侦听 cURLed URL 并处理
HttpServletRequests
发送给它的任何内容。它使用 base-64 解码记录并以某种方式将其转换为Widget
POJO。 Map<Long,Widget>
使用正确的键/值更新缓存 ( )。
这个解决方案感觉很尴尬,所以我首先想知道那里的任何 Java/Postgres 大师将如何处理这种情况。在这里投票是更好/更简单的选择吗(我只是很固执吗?)我忽略了另一个/更好/更标准的解决方案吗?
如果不是,并且此解决方案是将更改的记录从 Postgres 推送到应用程序层的标准方式,那么我会窒息如何编写触发器、存储过程和 shell 脚本,以便将整个widgets
记录传递到 cURL 语句中. 在此先感谢您的任何帮助。