Я работаю над многопользовательским реактивным приложением, использующим Spring-Webflux + Spring-data-r2dbc с драйвером r2dbc для подключения к базе данных Postgresql. Мультитенантная часть основана на схеме: одна схема на каждого арендатора. Таким образом, в зависимости от контекста (например, пользователя, вошедшего в систему) запросы будут попадать в определенную схему базы данных.
Я изо всех сил пытаюсь сделать это в r2dbc. В идеале это было бы так, как Hibernate с MultiTenantConnectionProvider (см. Пример 16.3).
Что я нашел и что сделал на данный момент:
- Можно использовать AbstractRoutingConnectionFactory, как указано, r2dbc-pool < / а>
Я посмотрел на . Интересно то, что на
prepareConnection
есть вызовsetSchema(connection)
:private Mono<Void> setSchema(PostgresqlConnection connection) { if (this.configuration.getSchema() == null) { return Mono.empty(); } return connection.createStatement(String.format("SET SCHEMA '%s'", this.configuration.getSchema())) .execute() .then(); }
Может быть, мне нужно найти способ переопределить это, чтобы динамически получать схему из контекста, а не из конфигурации?
В противном случае я мог бы попытаться указать схему в запросе как префикс таблицы:
String s = "tenant-1"; databaseClient.execute("SELECT * FROM \"" + s + "\".\"city\"") .as(City.class) .fetch() .all()
Но я больше не могу использовать SpringData или мне нужно переопределять каждый запрос, чтобы передать клиента в качестве параметра.
Любые подсказки / помощь приветствуются :)