H2 的休眠多租户问题:错误的架构

Posted

技术标签:

【中文标题】H2 的休眠多租户问题:错误的架构【英文标题】:Hibernate Multi tenancy issue with H2: wrong schema 【发布时间】:2019-05-27 14:41:12 【问题描述】:

我正在构建一个应用程序,该应用程序在生产环境中使用 PostgreSQL,并使用 H2 进行本地开发和使用最新版本的 Hibernate 和 Java 8 进行测试。

该实现适用于 PostgreSQL,但在使用 H2 时会出现问题。如果我调用同一个端点为 2 个不同的租户创建一个实体,则所有实体都在被调用的相同(第一个)架构中创建。

getConnection() 在我的 MultiTenantConnectionProviderImpl 中:

@Override
public Connection getConnection(String tenantIdentifier) throws SQLException 
    final Connection connection = getAnyConnection();
    connection.setSchema(tenantIdentifier);
    return connection;

application.properties:

spring.datasource.url=jdbc:h2:mem:mydb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
spring.datasource.username=sa
spring.datasource.password=

请注意,即使将 正确 tenantIdentifier 传递给 getConnection,查询仍会针对错误的架构运行。

这可能是 Hikari 连接池缓存连接而不传播 setSchema() 调用的问题吗?

【问题讨论】:

【参考方案1】:

看起来这是 H2 的一个错误,它的查询缓存没有发现架构的变化。

禁用查询缓存完全可以解决该问题:

jdbc:h2:mem:mydb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;QUERY_CACHE_SIZE=0

创建了一个错误报告:https://github.com/h2database/h2database/issues/1952

【讨论】:

以上是关于H2 的休眠多租户问题:错误的架构的主要内容,如果未能解决你的问题,请参考以下文章

在休眠多租户应用程序中启动时不查找数据源

具有多租户休眠的 Spring-Data JPA

如何理解多租户架构?

什么是多租户saas架构设计

如何在多租户应用程序中更新所有租户的所有架构?

架构02-构建多租户