Java缓存和动态更新
我需要在servlet启动时从数据库中“预加载”一些数据 因此,我想创建一些缓存,例如使用Java缓存和动态更新,java,design-patterns,caching,tomcat,servlets,Java,Design Patterns,Caching,Tomcat,Servlets,我需要在servlet启动时从数据库中“预加载”一些数据 因此,我想创建一些缓存,例如使用HashMap或类似的同步版本 我还需要在数据库更新更改时更新缓存。 所以我想加上一些“聆听者” 我的问题是:这是可行的还是我必须实际实施 如果是,什么样的设计模式是这里最好的方法 更新: 没有使用JPA或ORM。但是春天是可用的您可能会发现这里最能满足您的需求。缓存上的wiki可能与您最相关,但这里的确切方法在很大程度上取决于数据库更新更改的条件。如果希望在数据库更新更改时刷新整个缓存,或者至少使旧条目无
HashMap
或类似的同步版本
我还需要在数据库更新更改时更新缓存。所以我想加上一些“聆听者” 我的问题是:这是可行的还是我必须实际实施 如果是,什么样的设计模式是这里最好的方法 更新:
没有使用JPA或ORM。但是春天是可用的您可能会发现这里最能满足您的需求。缓存上的wiki可能与您最相关,但这里的确切方法在很大程度上取决于数据库更新更改的条件。如果希望在数据库更新更改时刷新整个缓存,或者至少使旧条目无效,则只要在数据库更新时调用
cache.invalidateAll()
。如果您愿意让缓存只稍微落后于时间,那么使用CacheBuilder.refreshAfterWrite(long,TimeUnit)
可能对您很合适。您可能会发现这里最能满足您的需求。缓存上的wiki可能与您最相关,但这里的确切方法在很大程度上取决于数据库更新更改的条件。如果希望在数据库更新更改时刷新整个缓存,或者至少使旧条目无效,则只要在数据库更新时调用cache.invalidateAll()
。如果您愿意让缓存只稍微落后于时间,那么使用CacheBuilder.refreshAfterWrite(long,TimeUnit)
可能对您很有用。Hashmap及其线程安全变体ConcurrentHashMap已经可用
有一些缓存解决方案可以使用,如ehcache,它还提供高级支持,如逐出策略等
至于设计模式,请阅读Observer设计模式。Hashmap及其线程安全变体ConcurrentHashMap已经可用 有一些缓存解决方案可以使用,如ehcache,它还提供高级支持,如逐出策略等
至于设计模式,请阅读Observer设计模式。我实际上有一个生产级项目,需要做类似的事情。我的解决方案是(这只是我的解决方案)在servlet启动时将对象(您所谓的“数据”)加载到内存中。之所以做出这个决定,是因为对象太大,导致客户端请求从数据库中拖出的速度太慢,而且我有少量并发用户。任何更改数据库中该对象数据的请求也会更改内存中的对象。当然,如果您与许多用户一起工作,则需要使用同步对象来完成此操作。如果数据量不是很大,那么每次用户请求有关数据的信息时,您都可以从数据库中提取数据
祝你好运。我实际上有一个生产级项目,我需要做这样的事情。我的解决方案是(这只是我的解决方案)在servlet启动时将对象(您所谓的“数据”)加载到内存中。之所以做出这个决定,是因为对象太大,导致客户端请求从数据库中拖出的速度太慢,而且我有少量并发用户。任何更改数据库中该对象数据的请求也会更改内存中的对象。当然,如果您与许多用户一起工作,则需要使用同步对象来完成此操作。如果数据量不是很大,那么每次用户请求有关数据的信息时,您都可以从数据库中提取数据
祝你好运。是的,你当然可以实现这一点
我会画一个小建筑,然后我会向你解释: 首先,您可以了解映射器和TDG。 映射器有一个名为cacheAll()的方法,该方法调用并委托给TDG的方法cacheAll(),而该方法的任务是从db中获取表中的所有行(要缓存在缓存对象中的行) 因此,基本上首先必须创建一个实现“ServletContextListener”的侦听器 这意味着它是整个servlet上下文的侦听器,在它的上下文初始化中,您必须调用mp.fill(Mapper.cacheAll()),因此它类似于sthg(这是一般代码,当然要更好地编写并优化它) 不要忘记在web.xml中添加侦听器:
<listener>
<listener-class>myServletContextListener </listener-class>
</listener>
此外,如果用户可以更改要缓存的数据,则将其设置为Threadlocal singleton。是的,当然可以实现该功能
我会画一个小建筑,然后我会向你解释: 首先,您可以了解映射器和TDG。 映射器有一个名为cacheAll()的方法,该方法调用并委托给TDG的方法cacheAll(),而该方法的任务是从db中获取表中的所有行(要缓存在缓存对象中的行) 因此,基本上首先必须创建一个实现“ServletContextListener”的侦听器 这意味着它是整个servlet上下文的侦听器,在它的上下文初始化中,您必须调用mp.fill(Mapper.cacheAll()),因此它类似于sthg(这是一般代码,当然要更好地编写并优化它) 不要忘记在web.xml中添加侦听器:
<listener>
<listener-class>myServletContextListener </listener-class>
</listener>
另外,如果用户可以更改要缓存的数据,则将其设置为Threadlocal singleton。是否使用库进行持久化?它们中的大多数已经支持各种形式的缓存,不需要重新发明轮子。不,直接SQL调用数据库您的缓存是否需要分发到多个进程?写操作是否需要更新其他缓存实例(或导致它们更新),还是仅与正在进行写操作的进程相关?@philwb:没有多个进程。仅与正在进行写操作的进程相关。一
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;
}
}