【问题标题】:Using Hibernate 2nd Level Cache and Multitenancy使用 Hibernate 二级缓存和多租户
【发布时间】:2017-06-03 16:11:13
【问题描述】:

我目前正在使用带有 MultiTenancy 选项的 Hibernate(MySQL 中每个租户的架构......所以每个租户的数据库)。我们有一个连接提供者和租户标识符的实现,可以为我们正确切换数据库模式。太好了。

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,应该是因为看看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 都与一个租户相关。

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

    【讨论】:

    • 嗯,这意味着所有租户数据最终都在同一个缓存中。基本上就像一个列鉴别器。
    • 查询缓存只有一个区域,是的。所以所有条目都在同一个区域。
    • Hibernate 的查询缓存独立于二级缓存机制,因此 QueryKey 类可能不适合证明二级缓存是多租户感知的,但文档确实声明它是二级缓存缓存支持多租户。
    【解决方案2】:

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

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

    以上引用似乎是确定的,但在同一部分中添加了一个信息说明:

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

    该注释直接涉及架构导出,但它对二级缓存和多租户的影响尚不清楚。似乎表明本机 Hibernate 完全支持多租户,但它的 JPA 实现可能不支持,尽管我可能会过度阅读该部分。

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2013-08-20
      • 2014-11-28
      • 2011-12-18
      • 2012-12-12
      • 2015-02-05
      • 2015-05-14
      • 2016-03-24
      • 2011-05-09
      相关资源
      最近更新 更多