Проблема многопользовательской аренды Hibernate с H2: неправильная схема

Я создаю приложение, которое использует 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()?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
244
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, это ошибка с H2, и кеш запросов не улавливает изменения в схеме.

Отключение кеша запросов полностью решает проблему:

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

Создан отчет об ошибке: https://github.com/h2database/h2database/issues/1952

Другие вопросы по теме