Создайте базу данных клиента программно

#database #spring-boot #hibernate #jpa #multi-tenant

#База данных #весенняя загрузка #переход в спящий режим #jpa #многопользовательский

Вопрос:

У меня есть приложение для нескольких арендаторов, разработанное с помощью Spring boot. В главной таблице я храню информацию о базах данных клиента. Я пытаюсь создать службу, которая получает строку из главной таблицы и создает для нее базу данных. Есть ли известный способ сделать это в Spring boot? Единственная информация, которую я могу найти в Интернете, — это создание при запуске приложения, и это нежелательно. Таблица master-tenant находится в главной схеме и имеет следующую структуру: введите описание изображения здесь

Метод из службы заключается в следующем:

 public void createTenant(TenantDTO tenantDTO) {
    tenantepository.save(new Tenant(tenantDTO));
    MasterTenant masterTenant = new MasterTenant();
    masterTenant.setDbName(tenantDTO.getTenantId());
    masterTenant.setDriverClass("com.mysql.jdbc.Driver");
    masterTenant.setTenantId(tenantDTO.getTenantId());
    masterTenant.setPassword("password");
    masterTenant.setStatus(EStatus.ACTIVE.name());
    masterTenant.setUserName("root");
    masterTenant.setUrl("jdbc:mysql://localhost:3306/" tenantDTO.getTenantId());
    DBContextHolder.setCurrentDb(masterTenant.getDbName());
    masterTenantRepository.save(masterTenant);
    multiTenantConnectionProvider.selectDataSource(masterTenant.getTenantId());
    //create schema   create tables from existing entities or run a script of sql
}
  

Мне нужна помощь в определении части с созданием схемы и таблиц.

Ответ №1:

Один из вариантов, о котором я могу подумать, — это иметь серверную часть, такую как Jenkins или AWS Lambda, которой вы можете отправить запрос на создание базы данных в вашем пуле серверов.

В случае выбора задания Jenkins у вас есть REST API, предоставленный Jenkins, который вы можете использовать для запуска задания. Поскольку она больше привязана к dev-ops, вы можете использовать сценарий, подобный terraform, в задании jenkins, который принимает идентификатор клиента в качестве параметра, чтобы установить его в качестве имени базы данных и т.д.

Некоторые преимущества использования задания Дженкинса заключаются в

  • Задание может выполняться долго
  • Поддерживает постановку в очередь
  • Может легко интегрироваться с devops и удалять эти зависимости с помощью приложения
  • Доступ на основе API для запуска задания, просмотра статуса и журналов и т.д.