【问题标题】:Vaadin 8 - application-wide cacheVaadin 8 - 应用程序范围的缓存
【发布时间】:2018-09-30 05:36:03
【问题描述】:

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

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

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

请原谅一个幼稚的问题。在 Vaadin/web 开发方面还没有那么精通。

【问题讨论】:

  • 你熟悉ehcache.org吗?
  • @TatuLund 看起来很有趣。但在 Vaadin 一定有办法。不想为此导入整个框架
  • 那些是什么对象? Ehcache 是数据库或 REST 后端缓存的不错选择。
  • @xavierz but there must be a way in Vaadin 他们为什么要重新发明轮子? stackoverflow.com/questions/575685/…
  • 你可以看看 Caching with Spring:spring.io/guides/gs/caching

标签: java caching vaadin heap-memory vaadin8


【解决方案1】:

对于应用程序范围的缓存,只需创建一个具有公共静态缓存的类,您可以从任何地方访问它。每个 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);
    }

}

这不是一个好的缓存,因为它不会使其条目无效。 如果可以添加任何库,则应添加 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);
    }
}

【讨论】:

  • so - Tomcat 不会以任何方式处理静态成员?
  • 我不知道。当您对此发表评论时,我进行了研究,并发现了一些可能指向这一点的结果。再说一次,我对静态成员使用缓存没有问题。如果他不想使用静态,他可以使用 spring 或 guava 并注入缓存管理器的全局实例。
  • 如果您使用的是 spring,有一个有趣的集成缓存解决方案可以全局运行
猜你喜欢
  • 2015-02-03
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多