Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java缓存和动态更新_Java_Design Patterns_Caching_Tomcat_Servlets - Fatal编程技术网

Java缓存和动态更新

Java缓存和动态更新,java,design-patterns,caching,tomcat,servlets,Java,Design Patterns,Caching,Tomcat,Servlets,我需要在servlet启动时从数据库中“预加载”一些数据 因此,我想创建一些缓存,例如使用HashMap或类似的同步版本 我还需要在数据库更新更改时更新缓存。 所以我想加上一些“聆听者” 我的问题是:这是可行的还是我必须实际实施 如果是,什么样的设计模式是这里最好的方法 更新: 没有使用JPA或ORM。但是春天是可用的您可能会发现这里最能满足您的需求。缓存上的wiki可能与您最相关,但这里的确切方法在很大程度上取决于数据库更新更改的条件。如果希望在数据库更新更改时刷新整个缓存,或者至少使旧条目无

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

因此,我想创建一些缓存,例如使用
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;
    }

}