gpt4 book ai didi

Java缓存和动态更新

转载 作者:行者123 更新时间:2023-11-28 22:05:51 25 4
gpt4 key购买 nike

我需要在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com