Tomcat 8 抛出 - org.apache.catalina.webresources.Cache.getResource 无法添加资源

2024-03-20

我刚刚将 Tomcat 从版本 7.0.52 升级到 8.0.14。

我得到了很多静态图像文件:

org.apache.catalina.webresources.Cache.getResource无法添加 [/base/1325/WA6144-150x112.jpg] 处的资源到缓存,因为那里 驱逐过期缓存后可用空间不足 条目 - 考虑增加缓存的最大大小

我没有指定任何特定的资源设置,并且我没有在 7.0.52 中获得此设置。

我在一份据称已修复的错误报告中发现了在启动时发生的这种情况。对我来说,这种情况不是在启动时发生,而是在请求资源时不断发生。

还有其他人遇到这个问题吗?

尝试至少禁用缓存,但我找不到如何指定不使用缓存的示例。 Tomcat 版本 8 中的属性已从上下文中消失。已尝试添加资源,但无法获得正确的配置。

<Resource name="file" 
    cachingAllowed="false"
    className="org.apache.catalina.webresources.FileResourceSet"
/>  

Thanks.


从 Tomcat 7 升级到 8 时,我遇到了同样的问题:持续出现大量有关缓存的日志警告。

1.简答

将其添加到Context https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Attributes你的 xml 元素$CATALINA_BASE/conf/context.xml:

<!-- The default value is 10240 kbytes, even when not added to context.xml.
So increase it high enough, until the problem disappears, for example set it to 
a value 5 times as high: 51200. -->
<Resources cacheMaxSize="51200" />

所以默认是10240(10 MB),因此设置比此更大的大小。然后调整到警告消失的最佳设置。 请注意,在流量较高的情况下,警告可能会再次出现。

1.1 原因(简述)

该问题是由于 Tomcat 无法达到其目标缓存大小而导致的,因为缓存条目小于这些条目的 TTL。因此,Tomcat 没有足够的缓存条目可能会过期,因为它们太新鲜了,因此它无法释放足够的缓存,从而输出警告。

这个问题在 Tomcat 7 中没有出现,因为 Tomcat 7 在这种情况下根本不输出警告。 (导致你和我在没有得到通知的情况下使用糟糕的缓存设置。)

与缓存的大小和 TTL 相比,在相对较短的时间内接收到相对大量的资源 HTTP 请求(通常是静态的)时,就会出现此问题。如果缓存达到最大值(默认为 10mb),并且超过其大小的 95% 包含新鲜缓存条目(新鲜意味着缓存中的时间少于 5 秒),那么您将收到 Tomcat 尝试的每个 webResource 的警告消息加载到缓存中。

1.2 可选信息

如果您需要在正在运行的服务器上调整cacheMaxSize而不重新启动它,请使用JMX。

最快的修复方法是完全禁用缓存:<Resources cachingAllowed="false" />,但这并不是最理想的,因此请按照我刚才的描述增加cacheMaxSize。

2. 长答案

2.1 背景信息

A 网络资源 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/WebResource.java是 Web 应用程序中的文件或目录。出于性能原因,Tomcat 可以缓存 WebSource。这静态资源缓存的最大值 https://tomcat.apache.org/tomcat-8.0-doc/config/resources.html#Common_Attributes(所有资源总计)默认为 10240 kbyte (10 MB)。当请求 webResource 时(例如加载静态图像时),webResource 会加载到缓存中,然后将其称为缓存条目。 每个缓存条目都有一个TTL https://tomcat.apache.org/tomcat-8.0-doc/config/resources.html#Common_Attributes(time to live),即允许缓存条目在缓存中停留的时间。当 TTL 到期时,缓存条目就可以从缓存中删除。 cacheTTL 的默认值为 5000 毫秒(5 秒)。

关于缓存还有更多内容要讲,但这与问题无关。

2.2 产生原因

以下代码来自缓存类 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java详细展示了缓存策略:


152 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#152  // Content will not be cached but we still need metadata size
153 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#153 long delta = cacheEntry.getSize http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/CachedResource.java#CachedResource.getSize%28%29();
154 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#154 size.addAndGet http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.addAndGet%28long%29(delta);
156 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#156 if (size.get http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.get%28%29() > maxSize) {
157 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#157 // Process resources unordered for speed. Trades cache
158 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#158 // efficiency (younger entries may be evicted before older
159 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#159 // ones) for speed since this is on the critical path for
160 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#160 // request processing
161 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#161 long targetSize =
162 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#162 maxSize * (100 - TARGET_FREE_PERCENT_GET) / 100;
163 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#163 long newSize = evict http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#Cache.evict%28long%2Cjava.util.Iterator%29(
164 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#164 targetSize, resourceCache.values http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Map.java#Map.values%28%29().iterator http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Collection.java#Collection.iterator%28%29());
165 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#165 if (newSize > maxSize) {
166 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#166 // Unable to create sufficient space for this resource
167 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#167 // Remove it from the cache
168 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#168 removeCacheEntry http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#Cache.removeCacheEntry%28java.lang.String%29(path);
169 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#169 log.warn http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-juli/8.0.24/org/apache/juli/logging/Log.java#Log.warn%28java.lang.Object%29(sm.getString http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-util/8.0.24/org/apache/tomcat/util/res/StringManager.java#StringManager.getString%28java.lang.String%2Cjava.lang.Object%5B%5D%29("cache.addFail", path));
170 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#170 }
171 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#171 }

加载 webResource 时,代码会计算缓存的新大小。如果计算出的大小大于默认的最大大小,则必须删除一个或多个缓存条目,否则新的大小将超过最大值。因此,代码将计算“targetSize”,这是缓存希望保持的大小(作为最佳值),默认情况下为最大值的 95%。为了达到此目标大小,必须从缓存中删除/逐出条目。这是使用以下代码完成的:


215 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#215  private long evict(long targetSize, Iterator http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Iterator.java#Iterator<CachedResource http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/CachedResource.java#CachedResource> iter) {
217 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#217 long now = System.currentTimeMillis http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/lang/System.java#System.currentTimeMillis%28%29();
219 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#219 long newSize = size.get http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.get%28%29();
221 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#221 while (newSize > targetSize && iter.hasNext http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Iterator.java#Iterator.hasNext%28%29()) {
222 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#222 CachedResource http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/CachedResource.java#CachedResource resource = iter.next http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Iterator.java#Iterator.next%28%29();
224 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#224 // Don't expire anything that has been checked within the TTL
225 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#225 if (resource.getNextCheck http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/CachedResource.java#CachedResource.getNextCheck%28%29() > now) {
226 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#226 continue;
227 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#227 }
229 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#229 // Remove the entry from the cache
230 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#230 removeCacheEntry http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#Cache.removeCacheEntry%28java.lang.String%29(resource.getWebappPath http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/CachedResource.java#CachedResource.getWebappPath%28%29());
232 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#232 newSize = size.get http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.get%28%29();
233 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#233 }
235 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#235 return newSize;
236 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#236 }

因此,当缓存条目的 TTL 过期且尚未达到 targetSize 时,该缓存条目将被删除。

在尝试通过逐出缓存条目来释放缓存后,代码将执行以下操作:


165 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#165  if (newSize > maxSize) {
166 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#166 // Unable to create sufficient space for this resource
167 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#167 // Remove it from the cache
168 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#168 removeCacheEntry http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#Cache.removeCacheEntry%28java.lang.String%29(path);
169 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#169 log.warn http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-juli/8.0.24/org/apache/juli/logging/Log.java#Log.warn%28java.lang.Object%29(sm.getString http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-util/8.0.24/org/apache/tomcat/util/res/StringManager.java#StringManager.getString%28java.lang.String%2Cjava.lang.Object%5B%5D%29("cache.addFail", path));
170 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/8.0.24/org/apache/catalina/webresources/Cache.java#170 }

因此,如果尝试释放缓存后,大小仍然超过最大值,则会显示无法释放的警告消息:

cache.addFail=Unable to add the resource at [{0}] to the cache for web application [{1}] because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

2.3 问题

正如警告消息所说,问题是

驱逐过期的缓存条目后可用空间不足 - 考虑增加缓存的最大大小

如果您的 Web 应用程序在短时间内(5 秒)加载大量未缓存的 WebResources(大约最大缓存,默认为 10mb),那么您将收到警告。

令人困惑的部分是 Tomcat 7 没有显示警告。这仅仅是由以下 Tomcat 7 代码引起的:


1606 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1606  // Add new entry to cache
1607 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1607 synchronized (cache) {
1608 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1608 // Check cache size, and remove elements if too big
1609 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1609 if ((cache.lookup http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#ResourceCache.lookup%28java.lang.String%29(name) == null) && cache.allocate http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#ResourceCache.allocate%28int%29(entry.size)) {
1610 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1610 cache.load http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#ResourceCache.load%28org.apache.naming.resources.CacheEntry%29(entry);
1611 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1611 }
1612 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ProxyDirContext.java#1612 }

结合:


231 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#231  while (toFree > 0) {
232 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#232 if (attempts == maxAllocateIterations) {
233 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#233 // Give up, no changes are made to the current cache
234 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#234 return false;
235 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/naming/resources/ResourceCache.java#235 }

因此,当 Tomcat 7 无法释放缓存时,它根本不会输出任何警告,而 Tomcat 8 将输出警告。

因此,如果您使用具有与 Tomcat 7 相同的默认缓存配置的 Tomcat 8,并且您在 Tomcat 8 中收到警告,那么您(和我的)Tomcat 7 的缓存设置在没有警告的情况下表现不佳。

2.4 解决方案

有多种解决方案:

  1. 增加缓存(推荐)
  2. 降低 TTL(不推荐)
  3. 禁止缓存日志警告(不推荐)
  4. 禁用缓存

2.4.1.增加缓存(推荐)

正如这里所描述的:http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html

通过增加<Resources cacheMaxSize="XXXXX" />Context元素在$CATALINA_BASE/conf/context.xml,其中“XXXXX”代表增加的缓存大小,以千字节为单位指定。默认值为 10240(10 MB),因此请设置比该值更高的大小。

您必须调整以获得最佳设置。请注意,当流量/资源请求突然增加时,问题可能会再次出现。

为了避免每次想要尝试新的缓存大小时都必须重新启动服务器,您可以使用 JMX 更改它而无需重新启动。

To 启用 JMX https://tomcat.apache.org/tomcat-8.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener,将其添加到$CATALINA_BASE/conf/server.xmlServer元素:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />并下载catalina-jmx-remote.jar from https://tomcat.apache.org/download-80.cgi https://tomcat.apache.org/download-80.cgi并把它放进去$CATALINA_HOME/lib。 然后使用 jConsole(默认随 Java JDK 附带)通过 JMX 连接到服务器,并查看设置以在服务器运行时增加缓存大小。这些设置的更改应立即生效。

2.4.2.降低 TTL(不推荐)

降低cacheTtl值低于 5000 毫秒并调整为最佳设置。

例如:<Resources cacheTtl="2000" />

这实际上归结为在内存中拥有并填充缓存而不使用它。

2.4.3.禁止缓存日志警告(不推荐)

配置日志记录以禁用记录器org.apache.catalina.webresources.Cache.

有关登录 Tomcat 的更多信息:http://tomcat.apache.org/tomcat-8.0-doc/logging.html http://tomcat.apache.org/tomcat-8.0-doc/logging.html

2.4.4.禁用缓存

您可以通过设置禁用缓存cachingAllowed http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html to false. <Resources cachingAllowed="false" />

尽管我记得在 Tomcat 8 的 beta 版本中,我使用 JMX 来禁用缓存。 (不确定具体原因,但通过 server.xml 禁用缓存可能会出现问题。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat 8 抛出 - org.apache.catalina.webresources.Cache.getResource 无法添加资源 的相关文章

  • Mathematica 中的数据缓存

    有一个非常耗时的操作在我的包中生成数据集 我想保存此数据集 并仅在我手动删除缓存文件时才让包重建它 这是我的方法作为包的一部分 myDataset Module fname data fname cached data mx If File
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • 最好的 NHibernate 二级缓存提供程序是什么?

    我见过有很多这样的 NCache Velocity 等等 但我还没有找到比较它们的表格 考虑以下标准什么是最好的 容易明白 最近正在维护中 是免费的或者有足够好的免费版本 Works 我无法说出什么是最好的或最差的 但我会分享我使用 NCa
  • ASP.Net 使用状态服务器和缓存增加 MaxProcesses(网络花园)

    我在 IIS7 上有一个 ASP Net 网站 我计划增加 MaxProcesses 以匹配服务器上的核心数量 4 核心 64 位 Windows Server 2008 根据我的阅读 如果我增加 MaxProcesses 来创建一个网络花
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 带缓存的简约 PHP 模板引擎,但不带 Smarty?

    有大量的问题 https stackoverflow com search q php template engine cache寻找 正确的 PHP 模板引擎 但它们都不专注于缓存 有谁知道一个轻量级 高质量 基于 PHP 5 的模板引擎
  • 写入 Django 缓存非常慢

    我曾经将数据库查询缓存在全局变量中以加快我的应用程序的速度 由于这是强烈不建议的 并且它确实产生了问题 所以我想使用任何类型的 Django 缓存 我尝试了 LocMemCache 和 DatabaseCache 但两者都需要 关于15秒设
  • 缓存静态 HTML 站点

    我通常使用 WordPress 但刚刚为客户完成了一个项目 该项目是一个静态 HTML 页面 由 8 个页面和每页约 2 个图像组成 使用 WordPress 我会使用 w3 总缓存 cloudflare photon 或通过 wp 引擎的
  • 在 R markdown 中,如何防止非缓存块的绘图被单独保存?

    当编织 R markdown 文件时 从任何块输出的图cache TRUE独立于 HTML 输出保存 这对我来说很有意义 然而 如果即使是单个块也有cache TRUE选项集 all块 包括那些cache FALSE 将他们的地块独立保存
  • Nestjs如何控制缓存?

    最近读了nestjs的文档 从中学到了一些东西 但我发现了一些让我困惑的事情 In 技术 缓存 https docs nestjs com techniques caching 文档告诉我使用像这样的装饰器 UseInterceptors
  • python 3 suds 缓存不工作

    我正在尝试编写一个通过 Python 访问 Sharepoint 的脚本 已安装以下库 suds jurko ntlm 以下代码成功 但需要接近 20 秒 usr bin env python3 from suds client impor
  • AngularJS:如何缓存从 $http 调用返回的 json 数据?

    如何缓存从 http 调用返回的 json 数据 我使用以下风格的 http 调用 http url SomeWebMethodUrl method POST data query somevalue headers Content Typ
  • Laravel 模型访问器从缓存中获取 - 性能增强

    我在数据库中有一个项目列表 每个项目都可以选择被否决或赞成 这些投票与其他项目字段一起存储在 MySql 中 例如这样的事情 Schema create items function table table gt increments id
  • Apache Tomcat/8.5.3 管理器应用程序 403 错误

    我有 tomcat 在 aws 上的 ubuntu 实例上运行 我可以成功访问If you re seeing this you ve successfully installed Tomcat Congratulations 页面 但是当
  • getExternalCacheDir() 在 Android 上如何工作?

    据我了解 我们将经常访问的对象缓存在比普通磁盘读取更容易访问的内存段中 getExternalCacheDir 相对于getCacheDir 指向外部文件系统 在我看来这是正常的getExternalFilesDir Android 如何优
  • 咖啡因与番石榴缓存

    根据这些微观基准 https github com ben manes caffeine wiki Benchmarks事实证明Caffeine https static javadoc io com github ben manes ca
  • 如何在 Struts 2 应用程序中读取文本文件 [重复]

    这个问题在这里已经有答案了 开发 Struts 2 应用程序时遇到以下问题 我需要读取使用我的应用程序部署在 Web 服务器中的文本文件 我怎样才能知道它的相对路径来访问它 换句话说 如果我知道部署目录内的相对路径 如何找到绝对路径 当我在
  • 如何使用mod_headers和mod_expires进行缓存

    我想在我的网站上缓存图像和其他文件 所以我所做的是确保 mod headers 和 mod expires 具有 usr sbin httpd l 然后将 htaccess 编辑为 ExpiresActive On ExpiresDefau
  • 一对一映射不适用于二级缓存

    我已经声明了 Hibernate 3 的以下映射 使用 FluentNHibernate public class ActivityMap ClassMap
  • 如何清除浏览器的缓存?

    当我在 Facebook 上玩应用程序且游戏未加载时 会出现提示 要求清除浏览器缓存 如何清除浏览器的缓存 似乎还没有人提到这一点 所以我想我应该插话一下 当你在 Chrome 中打开页面检查器时 你可以右键单击重新加载页面图标将与菜单一起

随机推荐