Java缓存和动态更新

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

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

我还需要更新数据库更新更改的缓存。
所以我想添加一些“听众”。

我的问题是:这是以某种方式提供还是我必须实际实现它?

如果是的话,哪种设计模式最适合这里?

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

是的,你当然可以实现它
我将绘制一个小型架构,然后向你解释:

架构图

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

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

 public class myServletContextListener implements ServletContextListener{ @Override public void contextInitialized(ServletContextEvent sce) { mp.fill(Mapper.cacheAll()); } // } 

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

  myServletContextListener   

这样做,就是在服务器启动时,将所有记录缓存到缓存对象中的hashmap mp中。

至于基于数据库更改更新缓存,您将不得不使用观察者模式 。

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

  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单例。

您可以在这里找到Guava最好的需求。 关于Caches的维基文章可能与您最相关,但这里的确切方法在很大程度上取决于数据库更新更改的条件。 如果要刷新数据库更新更改的整个缓存 – 或者至少使旧条目无效 – 只要发生数据库更新,就可以调用Cache.invalidateAll() 。 如果你愿意让缓存稍微落后于时间,那么使用CacheBuilder.refreshAfterWrite(long, TimeUnit)可能对你CacheBuilder.refreshAfterWrite(long, TimeUnit)

Hashmap和它的线程安全变体ConcurrentHashMap已经可用。

有一些缓存解决方案可以像ehcache一样提供,它们也提供了诸如驱逐策略等更高级的支持。

至于设计模式,请阅读Observer设计模式。

我实际上有一个生产水平项目,我需要做这样的事情。 我的解决方案是(这只是我的解决方案)是在servlet启动时将对象(你的“数据”)加载到内存中。 做出这个决定是因为该对象足够大,使得客户端请求缓慢从数据库中提取并且我有少量并发用户。 任何会在数据库中更改该对象数据的请求也会更改内存中对象。 如果您正在与许多用户合作,您当然需要使用同步对象来执行此操作。 如果数据量不大,那么每次用户请求有关数据的信息时,您都可以始终从数据库中提取数据。

祝好运。