CacheBuilder, использующий кеш гуавы для результата запроса - PullRequest
0 голосов
/ 12 октября 2018

Чтобы уменьшить количество обращений к БД для чтения данных из БД с использованием 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 голосов
/ 12 октября 2018

Кеш Guava принимает только два параметра типа: ключ и тип значения.Если вы хотите, чтобы ваш ключ был составным ключом, вам нужно создать новый составной тип для его инкапсуляции.По сути, это должно выглядеть так (извиняюсь за синтаксис, я не так часто использую 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);
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...