【问题标题】:How to implement java web application properties caching?如何实现 java web 应用程序属性缓存?
【发布时间】:2016-09-13 00:34:02
【问题描述】:

我有一个使用 servlets 3.0 和 Ajax 构建的简单 Web 应用程序,没有使用任何框架。

应用程序从 DB 呈现 GUI 组件。为了避免数据库故障导致应用程序无法工作的情况,我正在考虑使用一种缓存来为请求提供服务,而不是为每个 HTTP GET 请求访问数据库,如果请求的属性在该缓存中不可用,则从数据库,添加到缓存并服务请求。

我正在阅读有关属性文件和内存缓存实现的信息,然后遇到无状态 bean 和会话 bean 并感到困惑。那么有什么方法可以实现呢?

P.S:最好不要使用任何框架。

【问题讨论】:

标签: java jsp jakarta-ee caching cache-control


【解决方案1】:

恐怕你在这里混淆了概念......

属性文件是包含键值对的纯文本文件,用于存储配置并在运行时读取它们。它们与您的问题几乎没有共同之处。

无状态 bean 和有状态 bean 又是不同的东西。一个有状态的 bean 可能有一个内部状态。也就是说,即使上下文(db-contents 等)没有改变,对同一方法的两次调用也可能会产生不同的结果。

那么有什么方法可以实现缓存呢?没有用于缓存 DB 请求的内置实用程序。最简单(但也很幼稚)的方法是

private final Map<String, String> componentCache = new HashMap<>();

public String getComponentMarkup(String componentId, String... parameters){
    //Build a key for the parameters. Maybe simple stringconcatenation.
    String key=buildKey(componentId, parameters); 
    if (!componentCache.containsKey(key)){
        //Delegate the call to the "old" method which queries the database.
        String component = getComponentMarkupFromDb(componentId,parameters); 
        componentCache.put(key, component);
    }
    return componentCache.get(key);
}

但底线是您应该考虑为什么要自己实现缓存。有大量经过测试的解决方案可以解决您的问题(springhazelcastetc...)。 您的问题表明not invented here syndrom...

【讨论】:

  • 感谢 samjaf 抽出宝贵时间。关于为什么我不想使用 framwork,这只是我现在还没有准备好做的实现中的一个重大变化。如果那些提供一个组件只是为了解决这个问题,那么使用它并没有什么坏处。无论如何,再次感谢您的光临。
  • 我怀疑你会找到一个“即插即用”的缓存实现。缓存不是一个简单的问题,我知道的每个解决方案都至少需要一点配置。尽管如此,使用经过验证的缓存不应该比我提供的“虚拟”在您的实现中产生更大的变化。虽然会有更多的依赖关系和至少一点配置。我强烈建议不要在我的回答中使用幼稚的方法。
【解决方案2】:

有几种方法可以做到这一点,具体取决于您想要做什么:

  • 使用 servlet 过滤器在 Web 层缓存 Web 请求。
  • 在数据库访问层缓存 SQL 请求

Web 缓存将允许您基于 URL 模式和请求参数缓存请求,并且使用 Cacheonix Web 缓存可以轻松完成。在 Web 层缓存的好处是应用程序不必花时间等待数据库和呈现响应。

缓存 SQL 请求涉及更多内容,但好处是您可以细粒度地控制数据库执行的查询以及缓存的结果集。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2021-11-08
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多