使用Hibernate二级缓存和多租户

4

我目前正在使用带有多租户选项的Hibernate(在MySQL中为每个租户创建模式...因此每个租户都有自己的数据库)。我们实现了连接提供程序和租户标识符,可以正确地为我们切换DB模式。非常好。

现在,我们想开始探索在应用程序中使用第二级缓存。浏览文档时,不清楚它是否正常工作。

对于给定的租户数据库,将有具有给定DB ID(1,2,3等)的行作为主键。当我有两个租户DB时,这些实体是否分别存储?Hibernate是否会正确地为每个租户创建缓存(有效地)?

2个回答

3
在Hibernate 5.2文档的第19.4.3节“缓存”(在一些早期版本中是第16.3.3���)中,它提到:“Hibernate中的多租户支持与Hibernate二级缓存无缝配合。用于缓存数据的密钥编码了租户标识符。”以上引用似乎是明确的,但在同一节中,一个信息注释补充道:“目前,模式导出实际上不能与多租户一起使用。这可能不会改变。JPA专家组正在为规范的即将推出的版本定义多租户支持。”该注释直接涉及模式导出,但对于二级缓存和多租户的影响并不清楚。它似乎表明本机Hibernate完全支持多租户,但其JPA实现可能不支持,尽管我可能过度解读了该部分。

3

是的,它应该这样做,因为请看 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字段。

如果这对您不起作用,则是一个错误。


嗯,这意味着所有租户数据最终都会在同一个缓存中。基本上像是一个列区分器。 - John Ament
有一个查询缓存的单一区域,是的。因此,所有条目都放在同一个区域中。 - Vlad Mihalcea
Hibernate的查询缓存与二级缓存机制无关,因此QueryKey类可能不是证明二级缓存支持多租户感知的理想选择,但文档确实说明它的二级缓存支持多租户。 - Night Owl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接