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

时间:2019-05-27 14:41:13

标签: java hibernate jpa h2

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

该实现在PostgreSQL上运行良好,但是在使用H2时会引起问题。如果我调用相同的端点为2个不同的租户创建一个实体,则所有实体都是在所调用的相同(第一个)模式中创建的。

我的MultiTenantConnectionProviderImpl中的

getConnection():

@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 个答案:

答案 0 :(得分:0)

这似乎是H2的一个错误,它的查询缓存未获取架构更改。

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

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

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