Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?_Java_Caching_Jcabi - Fatal编程技术网

Java 如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?

Java 如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?,java,caching,jcabi,Java,Caching,Jcabi,我在项目中使用@Cacheable注释com.jcabi.aspects作为缓存机制,我有一个场景,需要从缓存中刷新特定数据,而不是刷新整个缓存。怎么可能呢 比如说, import com.jcabi.aspects.Cacheable; public class Employees { @Cacheable(lifetime = 1, unit = TimeUnit.HOURS) static int size(Organization org) { //

我在项目中使用
@Cacheable
注释
com.jcabi.aspects
作为缓存机制,我有一个场景,需要从缓存中刷新特定数据,而不是刷新整个缓存。怎么可能呢

比如说,

import com.jcabi.aspects.Cacheable;
public class Employees {
     @Cacheable(lifetime = 1, unit = TimeUnit.HOURS)
     static int size(Organization org) {
         // calculate their amount in MySQL
     }
     @Cacheable.FlushBefore
     static void add(Employee employee, Organization org) {
         // add a new one to MySQL
     }
}
如果我有一个由两个组织Org1和Org2使用的类Employees,现在如果向Org1添加了一个新员工,那么只有Org1的数据应该从缓存中刷新,而Org2的数据应该保留在缓存中

com.jcabi.aspects.Cacheable@Cacheable:。我相信你的设计应该得到改进,以使之成为可能。目前,您的班级
员工
实际上不是一个团队,而是一组过程(a)。这就是缓存不能正确执行的原因。相反,您需要一个新的类/装饰器
MySqlOrganization

class MySqlOrganization {
  private final Organization;
  @Cacheable
  public int size() {
    // count in MySQL
  }
  @Cacheable.FlushBefore
  public void add(Employee emp) {
    // save it to MySQL
  }
} 

现在看到正确OOP的好处了吗?:)

谢谢你的回复@yegor256。但还有一件事我想知道——如果我有两个对象,比如e1和e2,它们正在调用一个可缓存的方法,那么是否有可能只为e1调用该方法,而e2对象得到缓存结果?@ANKITMITTAL好吧,这就是它的工作原理:可缓存的方法只执行一次,对它的所有其他调用将返回以前缓存的值。或者我不理解这个问题?假设有两个对象e1和e2,它们都调用了可缓存方法add,那么该方法被调用两次,每个对象调用一次。有没有办法对多个对象也只调用一次?@ANKITMITTAL我认为您必须创建第三个对象,它将封装e1和e2。如果我没弄错你的问题。