Я работаю над мультитенантным реактивным приложением, использующим Spring-Webflux + Spring-data-r2db c с драйвером r2db c для подключения к базе данных Postgresql. Мультитенантная часть основана на схемах: одна схема на каждого арендатора. Таким образом, в зависимости от контекста (например, пользователь вошел в систему) запросы будут попадать в определенную схему базы данных.
Я пытаюсь решить, как выполнить sh, что в r2db c. В идеале это был бы способ, которым Hibernate делает с MultiTenantConnectionProvider (см. Пример 16.3).
Что я нашел и что я сделал до сих пор:
- Может используйте AbstractRoutingConnectionFactory , как упоминалось здесь . Но я вынужден создать ConnectionFactory с помощью арендатора / схемы. Мне кажется, что это далеко не эффективно / масштабируемо, я бы предпочел использовать пул соединений, например r2db c -pool
Я смотрел на PostgresqlConnectionFactory . Интересно, что на 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 или мне нужно переопределить каждый запрос, чтобы передать арендатора в качестве параметра.
Любые советы / помощь приветствуются:)