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 的休眠多租户问题:错误的架构的主要内容,如果未能解决你的问题,请参考以下文章