Vaadin 8 - 应用程序范围的缓存

时间:2018-04-19 16:16:15

标签: java caching vaadin heap-memory vaadin8

在我的Vaadin 8项目中,每当应用程序启动和运行时,我都会在主内存中保留一些对象。

为了提高内存效率,我希望为所有用户保留此缓存 - 而不是为每个用户提供单独的缓存。因此缓存应该是每个应用程序,即一组这些对象,而不是每个会话。

如何在Vaadin 8中执行此操作?请注意 - 此系统中没有Spring,因此在Spring上执行此操作不是一种选择。

原谅一个天真的问题。在Vaadin / web dev上还不精通。

1 个答案:

答案 0 :(得分:2)

对于应用程序范围的缓存,只需创建一个具有公共静态缓存的类,您可以从任何位置访问该类。每个UI和会话的静态对象都是相同的。

由于您没有指定要缓存的内容,我想您要缓存由您制作的自定义对象,以用于某种服务器端逻辑。

要在普通java中执行此操作,您可以创建一个简单的哈希映射以用作缓存。一个非常简单的例子是:

public class GlobalCache {

    private static ConcurrentHashMap<String, Object> cacheMap = new ConcurrentHashMap<>();

    public static Object getObject(String key, Function<String, Object> creator) {
        return cacheMap.computeIfAbsent(key, creator);
    }

}

这不是一个好的缓存,因为它不会使其条目无效。 如果您可以添加任何库,则应添加Guava。 Guava提供了一个很好的缓存实现,您可以使用:

//Add this to your gradle:
dependencies {
    implementation group: 'com.google.guava', name: 'guava', version: '24.1-jre'
}

//And this will become your code
public class GlobalCache {
    private static Cache<String, Object> cache = 
        CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(5, TimeUnit.MINUTES).build();

    public static Object getObject(String key, Callable<? extends Object> creator) throws ExecutionException {
        return cache.get(key, creator);
    }
}