2016-05-17 110 views
0

我有用servlets 3.0和Ajax构建的简单的web应用程序,没有使用前台程序。如何实现java web应用程序属性缓存?

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

我在阅读有关属性文件和内存中缓存实现,然后运行到无状态bean和会话bean中,并感到困惑。那么实现这个目标的方法是什么?

P.S:不希望使用任何前言。

+0

http://stackoverflow.com/questions/8292940/how-to-set-session-attribute-in-java? – 2016-05-17 04:32:21

回答

0

我怕你在这里混合概念....

属性文件是包含键 - 值对存储配置和运行时阅读纯文本文件。他们与你的问题没有什么共同之处。

无状态和有状态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 ...

+0

感谢samjaf为您的时间。关于为什么我不想使用前台工作,这只是我现在还没有准备好执行的一个重大改变。如果那些人只是为了解决这个问题而调整组件,那么使用它就没有什么坏处。无论如何,再次感谢您的阻止。 – Nullity

+0

我怀疑你会发现一个“plug'n'play”缓存实现。缓存不是一个简单的问题,我所知道的每个解决方案都至少需要一点配置。尽管如此,使用经过验证的缓存应该不会比我提供的“虚拟”更大。虽然会有更多的依赖关系,并且至少有一点配置。我强烈建议不要在我的答案中使用一种天真的方法。 – samjaf

0

有几个方法可以做到这一点取决于你想要做什么:在Web层使用Servlet过滤器

  • 缓存Web请求。在数据库访问层

的Web缓存

  • 缓存SQL请求将允许您缓存基于URL模式的请求,并请求参数和琐碎的使用Cacheonix网页缓存的事情。 Web层缓存的好处是应用程序不必花费时间等待数据库并呈现响应。

    缓存SQL请求涉及多一点,但好处是您可以精确地控制数据库执行哪些查询以及缓存哪些ResultSets。