我需要在 servlet 启动时从数据库“预加载”一些数据。
所以我想创建一些缓存,例如使用 HashMap
或一些类似的同步版本。
我还需要在数据库更新更改时更新缓存。
所以我想添加某种“监听器”。
我的问题是:这是可用的还是我必须实际实现它?
如果是,哪种设计模式是这里最好的方法?
更新:
没有使用 JPA 或 ORM。但是Spring可用
最佳答案
是的,你当然可以实现它
我会画一个小架构然后解释给你听:
首先,您可以了解 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/