Multi-tenancy с отдельной базой данных для каждого клиента с использованием Spring Data ArangoDB - PullRequest
1 голос
/ 03 июня 2019

Пока что я знаю только один способ установить имя базы данных, которое будет использоваться с Spring Data ArangoDB, - это жестко закодировать его в методе database() при расширении AbstractArangoConfiguration, например:

@Configuration
@EnableArangoRepositories(basePackages = { "com.company.mypackage" })
public class MyConfiguration extends AbstractArangoConfiguration {

  @Override
  public ArangoDB.Builder arango() {
    return new ArangoDB.Builder();
  }

  @Override
  public String database() {
    // Name of the database to be used
    return "example-database";
  }

}

Что если я хотел бы реализовать мультитенантность, когда каждый арендатор имеет данные в отдельной базе данных и использует, например, поддомен, чтобы определить, какое имя базы данных следует использовать?

Может ли база данных использоватьсяSpring Data ArangoDB определяется во время выполнения, динамически?

Этот вопрос связан с обсуждением здесь: Управление мультитенантным подключением ArangoDB - но для Spring Data ArangoDB специфично.

1 Ответ

0 голосов
/ 05 июня 2019

Оказывается, это восхитительно просто: просто измените метод ArangoConfiguration database() @Override, чтобы вернуть выражение Spring (SpEL):

    @Override
    public String database() {
        return "#{tenantProvider.getDatabaseName()}";
    }

, которое в этом примере ссылается на TenantProvider@Component, который может быть реализован следующим образом:

@Component
public class TenantProvider {

    private final ThreadLocal<String> databaseName;

    public TenantProvider() {
        super();
        databaseName = new ThreadLocal<>();
    }

    public String getDatabaseName() {
        return databaseName.get();
    }

    public void setDatabaseName(final String databaseName) {
        this.databaseName.set(databaseName);

    }
}

Этот компонент может быть тогда @Autowired где бы в вашем коде не указывалось имя базы данных, например, в фильтре сервлетов, или в моем случае вApache Camel Router Processor и в методах обслуживания баз данных.

Ps Я узнал об этой возможности, прочитав код ArangoTemplate и Spring Expression support раздел документации ( через ) и один объединенный запрос извлечения .

...