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

Java Vaadin 8-应用程序范围缓存,java,caching,vaadin,heap-memory,vaadin8,Java,Caching,Vaadin,Heap Memory,Vaadin8,在我的vaadin8项目中,每当应用程序启动和运行时,都会在主内存中保留一些对象 为了提高内存效率,我希望为所有用户保留此缓存,而不是为每个用户保留单独的缓存。因此,缓存应该是每个应用程序的,即这些对象的单个集合,而不是每个会话 在瓦丁8中如何做到这一点?请注意-此系统中没有Spring,因此在Spring上执行此操作不是一个选项 如果你问了一个天真的问题,请原谅。在Vaadin/web dev上还没有那么精明。对于应用程序范围的缓存,只需创建一个带有公共静态缓存的类,您可以从任何地方访问它。静

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

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

在瓦丁8中如何做到这一点?请注意-此系统中没有Spring,因此在Spring上执行此操作不是一个选项


如果你问了一个天真的问题,请原谅。在Vaadin/web dev上还没有那么精明。

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

因为您没有指定要缓存的内容,所以我假设您希望缓存由您创建的用于某种服务器端逻辑的自定义对象

要在纯java中实现这一点,可以创建一个简单的hashmap用作缓存。一个非常简单的例子是:

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);
    }

}
公共类全局缓存{
私有静态ConcurrentHashMap cacheMap=新ConcurrentHashMap();
公共静态对象getObject(字符串键、函数创建者){
返回cacheMap.computeIfAbsent(键,创建者);
}
}
这不是一个好的缓存,因为它不会使其条目无效。 如果你可以添加任何库,你应该添加番石榴。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);
    }
}
//将此添加到您的gradle中:
依赖关系{
实现组:“com.google.guava”,名称:“guava”,版本:“24.1-jre”
}
//这将成为你的代码
公共类全局缓存{
专用静态缓存=
CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(5,TimeUnit.MINUTES).build();

公共静态对象getObject(字符串键,Callable你熟悉吗?@TatuLund看起来很有趣。但在Vaadin中一定有办法。不想为此导入整个框架这些是什么类型的对象?Ehcache是数据库或rest后端缓存的好选择。@xavierz
但在Vaadin中一定有办法。他们为什么要重新发明轮子?你可以看看Spring缓存:那么-Tomcat不会以任何方式对静态成员发脾气吗?我不知道。当你对此发表评论时,我做了研究,发现了一些可能指向这一点的结果。然后,我再次对静态成员使用缓存,没有任何问题。如果他不想使用静态,他可以使用Spring或guava并注入全局变量缓存管理器的实例。如果您使用的是spring,则有一个有趣的全局工作的集成缓存解决方案