我目前正在使用Hibernate和MultiTenancy选项(MySQL中的每个租户架构......所以每个租户都有DB)。我们有连接提供程序和租户标识符的实现,它可以为我们正确地切换数据库模式。大。
现在,我们想开始在我们的应用程序中使用二级缓存。通过文档,不清楚这是否正常工作。
对于给定的租户数据库,将存在具有给定数据库ID的行... 1,2,3等作为主键。当我有两个租户数据库时,这些实体是分开存储的吗? Hibernate会为每个租户(有效地)正确创建缓存吗?
答案 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实现可能不会,尽管我可能会过度阅读该部分。