Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 将EhCache diskstore内容加载到内存中_Java_Caching_Ehcache_Memorycache - Fatal编程技术网

Java 将EhCache diskstore内容加载到内存中

Java 将EhCache diskstore内容加载到内存中,java,caching,ehcache,memorycache,Java,Caching,Ehcache,Memorycache,如中所述: 实际上,这意味着永久内存缓存将启动,其所有元素都在磁盘上。[…]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要延迟加载它们 我希望内存缓存启动时将其所有元素都存储在内存中,我如何才能实现这一点 原因是我们的网站对缓存进行了大量访问,因此我们第一次访问网站时,它的响应时间非常差。我假设所有缓存的元素都在DiskStore中,并且您希望在应用程序启动后立即将它们存储在内存中。在任何情况下,使用BootStrapCacheLoader和BootstrapCache

如中所述:

实际上,这意味着永久内存缓存将启动,其所有元素都在磁盘上。[…]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要延迟加载它们

我希望内存缓存启动时将其所有元素都存储在内存中,我如何才能实现这一点


原因是我们的网站对缓存进行了大量访问,因此我们第一次访问网站时,它的响应时间非常差。

我假设所有缓存的元素都在DiskStore中,并且您希望在应用程序启动后立即将它们存储在内存中。在任何情况下,使用BootStrapCacheLoader和BootstrapCacheLoaderFactory都会有所帮助

我只是想知道在应用程序启动后,我们在哪里将DiskStore加载到Memory中

您可以实现BootstrapCacheLoader,它将加载缓存元素,如下所示。方法的定义BootstrapCacheLoader.load(Ehcache缓存)可以

       //CustomBootstrapCacheLoader implements BootstrapCacheLoader


        List<?> keys = cache.getKeys();

        if ((keys == null) || keys.isEmpty())
        {
            return;
        }

        for (Object key : keys)
        {
           Element el = cache.getQuiet(key);
           cache.removeQuiet(key);
           cache.putQuiet(el);
        }
您可以使用CustomBootstrapCacheLoaderFactory如下定义缓存配置

<cache
         name="DummyCacheEl"
         maxElementsInMemory="3500"
         eternal="true"
         overflowToDisk="false"
         diskPersistent="true"
         memoryStoreEvictionPolicy="LRU">
         <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory"  properties="async=true"/>
</cache>  


你能在启动时遍历所有条目吗?我目前就是这么做的,但它的运行速度非常慢(我在循环中调用高级方法,这些高级方法也会发出DB请求)。如果有一种方法可以直接使用EhCache API在所有条目上进行迭代,那么对于BootstrapCacheLoader来说,这可能是一种好方法。代码中关于从磁盘删除并将其加载到内存中的一个小建议,Element el=cache.removeAndReturnElement(key);我建议使用这种方法,而不是先执行get,然后删除元素。True,但它会通知CacheEventListener。在引导缓存时可能不需要。是的,因此如果没有为该缓存配置通知程序,则这将有助于提高性能。是的。此外,我们必须异步加载缓存(在loadcache方法中生成一个线程),以便它现在阻止实例启动
删除它并将其放回内存中,从而删除磁盘版本。
我不想从磁盘缓存中删除元素?我只想把它们载入内存。
<cache
         name="DummyCacheEl"
         maxElementsInMemory="3500"
         eternal="true"
         overflowToDisk="false"
         diskPersistent="true"
         memoryStoreEvictionPolicy="LRU">
         <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory"  properties="async=true"/>
</cache>