H2 的 Hibernate 多租户问题:模式错误

Hibernate Multi tenancy issue with H2: wrong schema

我正在构建一个应用程序,该应用程序在生产中使用 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() 调用的问题吗?

看起来这是 H2 的一个错误,它的查询缓存没有获取架构中的更改。

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

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

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