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
我正在构建一个应用程序,该应用程序在生产中使用 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