我正在使用具有磁盘存储持久性的缓存.在应用程序的后续重新运行中,我收到以下错误:
net.sf.ehcache.store.DiskStore deleteIndexIfCorrupt
WARNING: The index for data file MyCache.data is out of date,
probably due to an unclean shutdown. Deleting index file MYCache.index
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,除了明确调用net.sf.ehcache.CacheManager.shutdown()应用程序中的某个地方?
缓存配置:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true" monitoring="autodetect">
<diskStore path="C:\work"/>
<cacheManagerEventListenerFactory class="" properties=""/>
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic,
multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=1"
propertySeparator=","
/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
<defaultCache
maxElementsInMemory="1"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="86400"
overflowToDisk="true"
diskSpoolBufferSizeMB="1"
maxElementsOnDisk="10000"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
/>
</ehcache>
Run Code Online (Sandbox Code Playgroud)
用于复制问题的代码:
import java.util.ArrayList;
import java.util.List;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class CacheTest {
static CacheManager manager = new CacheManager(CacheTest.class
.getResource("ehcache.xml"));
static Cache cache;
public static void main(String[] args) {
// Get a default instance
manager.addCache("test");
cache = manager.getCache("test");
// Generate some junk so that the
// cache properly flushes to disk
// as cache.flush() is not working
List<String> t = new ArrayList<String>();
for (int i = 0; i < 1000; i++)
t.add(null);
// Oddly enough fewer elements
// do not persist to disk or give
// an error
for (int i = 0; i < 100000; i++) {
cache.put(new Element(i, t));
}
cache.flush();
if (cache.get("key1") == null) {
System.out.println("key1 not found in cache!");
cache.put(new Element("key1", "value1"));
}
System.out.println(cache.get("key1"));
}
}
Run Code Online (Sandbox Code Playgroud)
nir*_*ran 13
尝试设置系统属性: net.sf.ehcache.enableShutdownHook = true
因此,您可以在程序的开头添加以下行:
System.setProperty("net.sf.ehcache.enableShutdownHook","true");
或者,从命令行传递属性:
java -Dnet.sf.ehcache.enableShutdownHook=true ...
注意,ehcache网站在使用此关闭钩子时确实提到了一些注意事项: 关闭Ehcache
何时运行关闭钩子,何时不运行
关闭钩子运行时:
- 程序通常存在.例如,调用System.exit(),或者退出最后一个非守护进程线程
- 虚拟机已终止.例如CTRL-C.这对应于Unix系统上的kill -SIGTERM pid或kill -15 pid.
在以下情况下,关闭钩子不会运行:
- 虚拟机中止
- SIGKILL信号被发送到Unix系统上的虚拟机进程.例如杀死-SIGKILL pid或kill -9 pid
- TerminateProcess调用将发送到Windows系统上的进程.
希望它有效:)