为什么在jvm重启后ehcache磁盘存储无效?

时间:2010-07-14 23:38:34

标签: java persistence ehcache

我在Linux上运行JDK 1.6.0_17上的Java应用程序。我正在使用ehcache 2.1.0,它有一个非常简单的ehcache.xml文件:

<diskStore path="/ext/ehcache"/>
<defaultCache
    overflowToDisk="true"
    diskPersistent="true"
    maxElementsInMemory="10000"
    maxElementsOnDisk="1000000000"
    eternal="true">
</defaultCache>

在我的java应用程序中,我有这段代码:

private static final String CACHE_NAME = "APP";

public static void init() {
    CacheManager.create();
    final CacheManager manager = CacheManager.getInstance();
    manager.addCache(CACHE_NAME);
}

private static Cache getCache() {
    final CacheManager manager = CacheManager.getInstance();
    return manager.getCache(CACHE_NAME);
}

public static Object get(String key) {
    final Cache cache = getCache();
    final Element element = cache.get(key);
    return (element != null) ? element.getValue() : null;
}

private static void put(String key, Object value) {
    final Cache cache = getCache();
    final Element element = new Element(key, value);
    cache.put(element);
}

如果我删除磁盘存储文件(/ ext / ehcache)并启动我的应用程序,我可以看到正在写入磁盘存储文件。如果我在应用程序运行时对文件执行“ls -l”,则“ls -l”表示文件大小随着时间的推移而变大。

然后我使用“kill -15”(SIGTERM)停止我的java应用程序。然后我重启我的java应用程序,似乎启动好了。 java应用程序继续将数据存储到ehcache中,但很长一段时间磁盘存储文件永远不会增长。 “ls -l”始终显示相同的文件大小。等了好几个小时后,文件再次开始增长。

我猜测磁盘存储中的所有内容都变得无效,并且文件的内容正在重新填充。如果是这种情况,为什么磁盘存储中的所有内容都会失效?我想在应用重启之间保持这些数据可用。

1 个答案:

答案 0 :(得分:4)

事实证明我忘了调用CacheManager.shutdown()。添加该调用可以解决问题。