【问题标题】:CacheBuilder using guava cache for query resultantCacheBuilder 使用番石榴缓存查询结果
【发布时间】:2018-10-12 14:29:45
【问题描述】:

为了减少使用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 进行缓存的正确方法吗?我错过了什么吗?

【问题讨论】:

    标签: guava hibernate-criteria


    【解决方案1】:

    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);
          }
        });
    

    【讨论】:

    • 如何在studentController.java文件的方法中调用这个?它会和我的问题一样还是我需要改变它。
    • 你在哪里保存缓存?在控制器还是 DAO 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多