我有一个 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 解码记录并以某种方式将其转换为WidgetPOJO。 Map<Long,Widget>使用正确的键/值更新缓存 ( )。
这个解决方案感觉很尴尬,所以我首先想知道那里的任何 Java/Postgres 大师将如何处理这种情况。在这里投票是更好/更简单的选择吗(我只是很固执吗?)我忽略了另一个/更好/更标准的解决方案吗?
如果不是,并且此解决方案是将更改的记录从 Postgres 推送到应用程序层的标准方式,那么我会窒息如何编写触发器、存储过程和 shell 脚本,以便将整个widgets记录传递到 cURL 语句中. 在此先感谢您的任何帮助。