CacheBuilder使用番石榴缓存查询结果

时间:2018-10-12 06:16:45

标签: guava hibernate-criteria

为了减少使用query从数据库读取数据的数据库命中率,我打算将结果保留在缓存中。为此,我使用了番石榴缓存。

studentController.java

public Map<String, Object> getSomeMethodName(Number departmentId, String departmentType){
    ArrayList<Student> studentList = studentManager.getStudentListByDepartmentType(departmentId, departmentType);
    ----------
    ----------
    }

StudentHibernateDao.java (条件查询)

@Override
    public ArrayList<Student> getStudentListByDepartmentType(Number departmentId, String departmentType) {
        Criteria criteria =sessionFactory.getCurrentSession().createCriteria(Student.class);
        criteria.add(Restrictions.eq("departmentId", departmentId));
        criteria.add(Restrictions.eq("departmentType", departmentType));
        ArrayList<Student> studentList = (ArrayList)criteria.list();
        return studentList;
    }

要缓存标准查询结果,我从构建CacheBuilder开始,如下所示。

private static LoadingCache<Number departmentId, String departmentType, ArrayList<Student>> studentListCache = CacheBuilder
            .newBuilder().expireAfterAccess(1, TimeUnit.MINUTES)
            .maximumSize(1000)
            .build(new CacheLoader<Number departmentId, String departmentType, ArrayList<Student>>() {
                public ArrayList<Student> load(String key) throws Exception {
                    return getStudentListByDepartmentType(departmentId, departmentType);
                }
            });

在这里,我不知道将CacheBuilder函数放在哪里以及如何将多个关键参数(即departmentId和departmentType)传递到CacheLoader并调用它。

这是使用guava进行缓存的正确方法。我有什么想念的吗?

1 个答案:

答案 0 :(得分:0)

Guava的缓存仅接受两个类型参数,一个键和一个值类型。如果希望您的键是复合键,则需要构建一个新的 compound 类型以对其进行封装。实际上,它需要看起来像这样(我为自己的语法道歉,我不经常使用Java):

// Compound Key type
class CompoundDepartmentId {
  public CompoundDepartmentId(Long departmentId, String departmentType) {
    this.departmentId = departmentId;
    this.departmentType = departmentType;
  }
}

private static LoadingCache<CompoundDepartmentId, ArrayList<Student>> studentListCache = 
  CacheBuilder
    .newBuilder().expireAfterAccess(1, TimeUnit.MINUTES)
    .maximumSize(1000)
    .build(new CacheLoader<CompoundDepartmentId, ArrayList<Student>>() {
      public ArrayList<Student> load(CompoundDepartmentId key) throws Exception {
        return getStudentListByDepartmentType(key.departmentId, key.departmentType);
      }
    });