Java缓存和动态更新

标签 java design-patterns caching tomcat servlets

我需要在 servlet 启动时从数据库“预加载”一些数据。

所以我想创建一些缓存,例如使用 HashMap 或一些类似的同步版本。

我还需要在数据库更新更改时更新缓存。
所以我想添加某种“监听器”。

我的问题是:这是可用的还是我必须实际实现它?

如果是,哪种设计模式是这里最好的方法?

更新:
没有使用 JPA 或 ORM。但是Spring可用

最佳答案

是的,你当然可以实现它
我会画一个小架构然后解释给你听:

Architecture diagram

首先,您可以了解 Mappers here和 TDG here . 映射器有一个名为 cacheAll() 的方法,它调用并委托(delegate)给 TDG 的方法 cacheAll(),后者的任务是从数据库中获取表中的所有行(您要在缓存对象中缓存的行)。

所以基本上首先你必须创建一个实现“ServletContextListener”的监听器 这意味着它是整个 servlet 上下文的监听器,在它的 contextInitialized 中你必须调用 mp.fill(Mapper.cacheAll()),所以它就像 (这是一般的代码,当然要写的更好,优化一下)

public class myServletContextListener implements ServletContextListener{

@Override
public void contextInitialized(ServletContextEvent sce) {
        mp.fill(Mapper.cacheAll());
 }

//
}

不要忘记在 web.xml 中添加监听器:

<listener>
    <listener-class>myServletContextListener </listener-class>
</listener>

所以这会做什么,在服务器启动时,将所有记录缓存到缓存对象中的 hashmap mp 中。

至于根据数据库变化更新缓存,你将不得不使用observer pattern .

更新
我忘了提,关于缓存对象,我假设你希望所有用户或你的应用程序都可以访问它,所以你应该将它编码为单例(单例模式),代码如下:

 public class cacheObject
{
    private static Map cMap;
    private static cacheObject cObject;
    private cacheObject()
    {
        cMap = Mapper.cacheAll();
    }
    public static synchronized cacheObject getInstance()
    {
        if (cObject == null){
            cObject = new cacheObject();
        }
        return cObject;
    }

}

此外,如果您要缓存的数据可以被用户更改,那么将其设为Threadlocal 单例。

关于Java缓存和动态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9068951/

相关文章:

java - 如何自定义<h :messages/> style in JSF 2?

java - Java for 循环中的 if 语句

c++ - 在C++中使用静态方法实现工厂模式

php - 动态缩小 CSS : leveraging browser caching

AngularJS templateUrl 未刷新,始终使用缓存版本

caching - Aerospike 为特定字段设置到期日期

java - 是否可以仅使用 lambda 表达式将字符串转换为 int[]?

Java if 条件检查空值和 null 值

java - Java 中的 Memento 不通过撤消更新状态

java - 如何在Java/Android模块化库中使两个相关的包相互独立?