我正在构建一个在生产环境中使用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()
调用会成为问题?
答案 0 :(得分:0)
这似乎是H2的一个错误,它的查询缓存未获取架构更改。
完全禁用查询缓存可以解决以下问题:
jdbc:h2:mem:mydb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;QUERY_CACHE_SIZE=0
创建了一个错误报告:https://github.com/h2database/h2database/issues/1952