2016-07-15 70 views
1

Cache2k看起来像一个非常有前途的缓存实现。不幸的是,文档非常有限,这就是为什么我需要一些帮助解决以下问题。我正在使用最新版本0.26-BETA。Cache2k:java.lang.UnsupportedOperationException:loader未设置

根据文档的高速缓存应该是这样创建的:

Cache<String,String> c = 
CacheBuilder.newCache(String.class, String.class).build(); 
String val = c.peek("something"); 
assertNull(val); 
c.put("something", "hello"); 
val = c.get("something"); 
assertNotNull(val); 
c.destroy(); 

不幸的是,至少这些方法中的2已被弃用,包括CacheBuilder类本身。因此,我试图创建缓存是这样的:

 org.cache2k.Cache<String, Object> newCache = Cache2kBuilder.of(String.class, Object.class) 
       .name(cacheKey.toString()) 
       .entryCapacity(100000) 
       .eternal(true) 
       .build(); 

然而,这将引发“java.lang.UnsupportedOperationException:装载机未设置”例外。

因此,问题是:我应该如何构建缓存,以便不发生此异常?

编辑:

这给了我同样的异常:

  org.cache2k.Cache<Object, Object> newCache = 
       CacheBuilder.newCache(Object.class, Object.class) 
         .eternal(true) 
         .build(); 

编辑#2:

只是多了一个注:当我复制&代码从wiki页面我得到粘贴一个错误 - 如下图所示。

This does not seem to work with jdk 1.8.0_91

用什么JDK版本,你的测试?我会尝试删除现在导致问题的<>。

非常感谢!

迈克尔

回答

1

Cache2k看起来像一个非常有前途的缓存实现。

谢谢:)

根据文档的高速缓存应该是这样的

创建到位有新的接口。不推荐使用的版本仍然支持旧版cache2k版本的用户。这将在接下来的几周内得到解决。对困惑感到抱歉。

请看看这里获取最新入门信息: https://github.com/cache2k/cache2k/blob/master/doc/src/docs/asciidoc/user-guide/sections/_start.adoc

然而,这将引发“java.lang.UnsupportedOperationException:装载机未设置”例外。 因此,问题是:我应该如何构建缓存,以便不发生此异常?

简短的回答:要么使用cache.peek()或等待0.27,从那以后它正在与cache.get()透明。

较长的答案:在我们自己的应用程序中,我只在定义了加载程序时使用cache.get(),在没有定义加载程序的情况下使用cache.peek(),或者我只想检查高速缓存。只为通读用途保留cache.get(),似乎是一个好主意。不过,我推断这可能是新用户的一个警告,所以我改变了这种行为并将其与其他缓存解决方案对齐。

回答编辑2: 对于非类型化缓存,请使用工厂方法Cache2kBuilder.forUnkownTypes()。构造匿名类只需要特定的类型。

+0

我刚刚添加了另一个编辑(编辑#2),以便我可以上传图像。 – michaeldd

+0

再次删除编辑3,因为我还没有看到编辑2的答案。对#2的回复似乎是一种改进。好的,我现在明白了,但重新阅读完整答案之后出现了什么问题。我现在将使用peek方法,因为无论如何都要封装缓存实现 - 所以我可以将get方法指向您的peek方法。 – michaeldd

+0

太好了。我想到,如果你想构建一个无类型的缓存,你实际上应该使用'Cache2kBuilder.forUnkownTypes()'。我可能会在'new Cache2kBuilder (){}'背后插入一个异常,所以只有一种方法可以做到这一点。 – cruftex