Как подключить 100(более) баз данных, имеющих одинаковые таблицы и структуру, с помощью spring data jpa

#hibernate #spring-data-jpa

Вопрос:

У нас есть требование.

  1. Мы должны динамически создавать базу данных/схему.
  2. Мы получим схему/базу данных во время выполнения, и нам нужно будет динамически подключить эту базу данных, если она уже существует, в противном случае потребуется создать базу данных/схему и подключиться к ней.

Структура для всех схем/баз данных одинакова, это означает, что имена таблиц будут одинаковыми во всех базах данных/схемах.

Пожалуйста, веди меня.

Ответ №1:

Я столкнулся с подобным случаем, как и вы. Я могу дать вам только некоторые исходные фрагменты из моего проекта, и я надеюсь, что у вас появится идея.

  1. Динамическое создание схемы
 ...

// we need a datasource config from your current ApplicationContext
HikariDataSource dataSource = (HikariDataSource) ctx.getBean("mydatasource"); 
var currentConnection = dataSource.getConnection();
boolean isSchemaCreated = currentConnection.createStatement()
        .execute(String.format("CREATE SCHEMA IF NOT EXISTS "%s";", schemaName));


var connectionURLString = currentConnection.getMetaData().getURL()   "?currentSchema="   schemaName;
logger.info("connection URL with schema: {}", connectionURLString);

Map<String, String> settings = new HashMap<>();
settings.put(AvailableSettings.DRIVER, driver);
settings.put(AvailableSettings.DIALECT, dialect);
settings.put(AvailableSettings.URL, connectionURLString);
settings.put(AvailableSettings.USER, user);
settings.put(AvailableSettings.PASS, pass);
...

var metadata = new MetadataSources(new StandardServiceRegistryBuilder().applySettings(settings).build());


List<Class<?>> annotatedClasses = ...
annotatedClasses.forEach(c -> metadata.addAnnotatedClass(c));


var schemaExport = new SchemaExport();
schemaExport.setFormat(true);
schemaExport.setDelimiter(";");

schemaExport.execute(EnumSet.of(TargetType.DATABASE), Action.CREATE, metadata.buildMetadata());

schemaExport.getExceptions().forEach(e -> logger.info(((Exception) e).getCause().getMessage()));
    
    ...
 
  1. Схемы переключения во время выполнения (мульти-аренда)

То, что вам здесь нужно,-это своего рода многопользовательская аренда, которая может быть реализована с помощью поставщика hibernate MultiTenantConnectionProvider. Здесь вы установили и освободили схему базы данных, когда ваше приложение запрашивает подключение к базе данных.

Комментарии:

1. Мы также должны создавать таблицы при создании схемы. Является ли лучшим подходом создание хранимой процедуры, которая создает схему и таблицу за один раз. пожалуйста, посоветуйте мне это.

2. Да, ваш подход также является жизнеспособным вариантом. Для меня это был невыполнимый вариант, потому что в моем проекте есть случаи, когда таблицы также отличаются. Я забыл упомянуть, что annotatedClasses это классы сущностей JPA, которые используются для создания таблиц в базе данных с помощью инструмента SchemaExport.