我正在重构一些代码以使用guava Cache。
初始代码:
public Post getPost(Integer key) throws SQLException, IOException {
return PostsDB.findPostByID(key);
}
为了不破坏某些内容,我需要按原样保留任何引发的异常,而不用包装它。
当前的解决方案看起来有些难看:
public Post getPost(final Integer key) throws SQLException, IOException {
try {
return cache.get(key, new Callable<Post>() {
@Override
public Post call() throws Exception {
return PostsDB.findPostByID(key);
}
});
} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause instanceof SQLException) {
throw (SQLException) cause;
} else if (cause instanceof IOException) {
throw (IOException) cause;
} else if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
} else if (cause instanceof Error) {
throw (Error) cause;
} else {
throw new IllegalStateException(e);
}
}
}
有什么办法可以使它变得更好?
刚写完问题,就开始考虑使用泛型的效用方法。然后想起了Throwables的一些东西。是的,它已经在那里!)
可能还需要处理UncheckedExecutionException甚至ExecutionError。
因此解决方案是:
public Post getPost(final Integer key) throws SQLException, IOException {
try {
return cache.get(key, new Callable<Post>() {
@Override
public Post call() throws Exception {
return PostsDB.findPostByID(key);
}
});
} catch (ExecutionException e) {
Throwables.propagateIfPossible(
e.getCause(), SQLException.class, IOException.class);
throw new IllegalStateException(e);
} catch (UncheckedExecutionException e) {
Throwables.throwIfUnchecked(e.getCause());
throw new IllegalStateException(e);
}
}
非常好!
另请参见ThrowablesExplained,LoadingCache.getUnchecked以及为什么我们不赞成Throwables.propagate的原因。
主要内容:1.Table - 双键Map,2.BiMap - 双向Map,3.Multimap - 多值Map,4.RangeMap - 范围Map,5.ClassToInstanceMap - 实例MapGuava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。 1.Table - 双键Map java中的Map
我有以下情况: null 请注意,许多服务访问用户存储库,因此在保存之前直接实现新逻辑是很麻烦的。 为了在保存/更新之前执行验证,而不必为每个保存/更新调用显式实现验证,我尝试使用JPA侦听器。使用和,我实现了在每次保存/更新之前执行验证的目标。但是,这种解决方案存在两个问题: 检查的异常不会在保存/更新用户的方法上强制执行,并且异常会通过侦听器自动包装为 当试图使用AOP捕获所述并解压缩原始检查
主要内容:1 什么是Guava LoadingCache接口,2 Guava LoadingCache接口的语法,3 Guava LoadingCache接口的方法,5 Guava LoadingCache接口的例子1 什么是Guava LoadingCache接口 Guava 通过接口 LoadingCache<K,V> 提供了一个非常强大的基于内存的缓存机制。值会自动加载到缓存中,它提供了许多对缓存需求有用的实用方法。 2 Guava LoadingCache接口的语法 3 Guava Lo
Java8类型注释(JSR308)允许类型检查器执行静态代码分析。例如,检查器框架可以通过注释检查可能的空值。 各种项目都定义了自己的非空注释,例如: 等(参见《检查框架手册》第3.7节) 对于此类注释,我希望具有,因为它们通常在运行时不需要。最重要的是,代码对相应的库没有任何运行时依赖关系。 虽然遵循这种方法,但大多数其他的NonNull注释,如(JSR305)和本身,都具有。是否有任何特定的原
我写了一份使用番石榴缓存的Flink作业。缓存对象是在main()函数中调用的run()函数中创建和使用的。 它类似于: 如果我以某种程度的并行性运行这个Flink作业,所有并行任务是否都将使用相同的缓存对象?如果没有,如何使它们都使用单个缓存? 缓存用于流的进程()函数内部。所以这就像 您可以将我的用例视为基于缓存的重复数据消除,因此我希望所有并行任务都指向单个缓存对象
我知道stackoverflow上也有类似的问题,但在调查了其中几个之后,我知道 > 他们正在使用不同的存储格式 但这些并不是令人困惑的地方,我不知道什么时候该用一个,什么时候该用另一个。 考虑以下两种情况: 如果由于某种原因(例如错误修复或意外崩溃)需要关闭或重新启动整个应用程序,那么我必须使用保存点来恢复整个应用程序