Я создаю приложение, которое использует PostgreSQL в производстве и H2 для локальной разработки и тестирования с использованием последних версий Hibernate и Java 8.
Реализация отлично работает для PostgreSQL, но вызывает проблемы при использовании H2. Если я вызову одну и ту же конечную точку для создания объекта для двух разных арендаторов, все объекты будут созданы в одной и той же (первой) схеме, которая была вызвана.
getConnection() в моем MultiTenantConnectionProviderImpl:
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
connection.setSchema(tenantIdentifier);
return connection;
}
приложение.свойства:
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