Многопользовательское приложение на основе схемы с r2dbc - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над мультитенантным реактивным приложением, использующим 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 или мне нужно переопределить каждый запрос, чтобы передать арендатора в качестве параметра.

Любые советы / помощь приветствуются:)

...