2017-01-19 1 views
2

В настоящее время я использую Hibernate с параметрами MultiTenancy (схема для каждого арендатора в MySQL ... так что DB для арендатора). У нас есть реализация поставщика подключения и идентификатора арендатора, который правильно переключает схемы БД для нас. Отлично.Использование Hibernate 2-го уровня кэш-памяти и многоуровневости

Теперь мы хотим начать изучение с использованием 2-го уровня кэша в нашем приложении. Просматривая документы, неясно, работает ли это правильно или нет.

Для данной базы данных арендатора в качестве первичного ключа будут указаны строки с заданными идентификаторами базы данных ... 1,2,3 и т. Д. Когда у меня есть две базы для арендаторов в игре, эти объекты хранятся отдельно? Будет ли Hibernate правильно создавать кеши на одного арендатора (эффективно)?

ответ

2

Да, это должно, потому что посмотрите на QueryKey:

public class QueryKey 
    implements Serializable { 
    private final String sqlQueryString; 
    private final Type[] positionalParameterTypes; 
    private final Object[] positionalParameterValues; 
    private final Map namedParameters; 
    private final Integer firstRow; 
    private final Integer maxRows; 
    private final String tenantIdentifier; 
    private final Set filterKeys; 

    private final CacheableResultTransformer customTransformer; 

    private transient int hashCode; 

    ... 

} 

Как вы можете видеть, что есть tenantIdnetifier поле, так что каждый query cache entry является по отношению к Арендатору.

Если это не сработает для вас, значит, это ошибка.

+0

Хмм, поэтому это означает, что все данные арендатора попадают в один и тот же кеш. В принципе, как дискриминатор столбцов. –

+0

Есть один регион для Query Cache, да. Таким образом, все записи идут в том же регионе. –

+0

Кэш-память Hibernate не зависит от механизма кэширования второго уровня, поэтому класс QueryKey может быть не идеальным, как доказательство того, что кеш второго уровня является обладателем многопользовательского доступа, но в документации указано, что в кеш второго уровня поддерживается многозадачность. –

0

В разделе 19.4.3 «Caching», который был раздел 16.3.3 в некоторых более ранних версиях 5,2 документации Hibernate говорит: поддержка

Multitenancy в Hibernate работает с кэшем второго уровня Hibernate. Ключ, используемый для кэширования данных, кодирует идентификатор арендатора.

Вышеупомянутая цитата кажется окончательным, но в том же разделе информационная записка добавляет:

В настоящее время экспорт схемы не будет реально работать с Multitenancy. Это может не измениться. Экспертная группа JPA находится в процессе определения поддержки многоуровневой поддержки для предстоящей версии спецификации.

Заметка непосредственно адресует экспорт схемы, но последствия для кеша второго уровня и многоуровневости не ясны. Похоже, что родной Hibernate полностью поддерживает многопользовательскую систему, но реализация JPA не может, хотя я мог бы прочитать этот раздел.

Смежные вопросы