使用Hibernate二级缓存和多租户

时间:2017-01-19 04:21:27

标签: java hibernate jpa caching second-level-cache

我目前正在使用Hibernate和MultiTenancy选项(MySQL中的每个租户架构......所以每个租户都有DB)。我们有连接提供程序和租户标识符的实现,它可以为我们正确地切换数据库模式。大。

现在,我们想开始在我们的应用程序中使用二级缓存。通过文档,不清楚这是否正常工作。

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

2 个答案:

答案 0 :(得分: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都与租户相关。

如果这不适合你,那就是一个错误。

答案 1 :(得分:0)

在第19.4.3节“缓存”中,在某些早期版本中是第16.3.3节,Hibernate 5.2文档说:

  

Hibernate中的多租户支持与Hibernate二级缓存无缝协作。 用于缓存数据的密钥对租户标识符进行编码

以上引用似乎是确定的,但在同一部分中,信息性说明补充说:

  

目前,架构导出不适用于多租户。这可能不会改变。   JPA专家组正在定义多租户   支持即将发布的规范版本。

该注释直接解决了模式导出,但它对二级缓存的影响并且多租户不明确。它似乎表明本机Hibernate完全支持多项保护,但它的JPA实现可能不会,尽管我可能会过度阅读该部分。