Создание баз данных во время выполнения с помощью Hibernate?

#java #mysql #hibernate #schema

#java #mysql #гибернация #схема

Вопрос:

Возможно ли использовать Hibernate для создания новой базы данных во время выполнения (используя аннотации объектов модели в виде схемы, или из обычного файла схемы, который мы определяем), а затем установить соединение с этой базой данных, чтобы ее можно было использовать?

Что мы хотели бы сделать, так это то, что когда происходит определенное действие (например, создается новый пользователь), мы создаем новую базу данных для этого пользователя (из определенных аннотаций или просто статической схемы), а затем имеем дескриптор этой базы данных, чтобы пользователь мог записывать в нее.

Пользовательский элемент предназначен просто для иллюстрации концепции…

Спасибо!

Ответ №1:

На высоком уровне, что бы вы сделали для достижения чего-то подобного, это:

  1. Когда произойдет событие запуска, запустите DDL для создания новой базы данных через соединение JDBC — вероятно, наиболее разумно, чтобы эта схема была сгенерирована hbm2ddl во время сборки.

  2. Создайте новую DataSource для этой базы данных и новую SessionFactory из DataSource

  3. Затем это SessionFactory должно быть введено в уровень доступа к данным вашего приложения (или просмотрено), чтобы найти подходящее SessionFactory для пользователя.

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

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

1. Это кажется наиболее логичным решением. Хотя масштабируемо ли это? Сколько фабрик сеансов (и их источников данных) может содержать одно приложение?

2. Понятия не имею, но если вы проведете несколько сравнительных тестов, я хотел бы увидеть результаты 🙂

Ответ №2:

Согласен с Мэттом би, но вы уверены, что это хорошая идея — делать такую вещь?

Я предполагаю, что у вас разные клиенты и вы хотите хранить данные каждого из них в отдельной базе данных (или что-то в этом роде). Почему бы не сохранить все данные клиентов в одной базе данных и не отфильтровать эти данные по идентификатору клиента?

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

1. Как я уже говорил в вопросе, пример клиента, который я привел, был просто примером. Это не тот способ, которым мы собираемся его использовать, но принципы те же. Кроме того, в данный момент мы просто исследуем различные подходы. Другой вариант, который мы рассматриваем, — это разделение с помощью ключа (например, идентификатора клиента).

2. Причина, по которой я лично задаю этот вопрос, связана с очень строгими условиями безопасности моего клиента, которые требуют отдельного подхода к базе данных. Требуется, чтобы их данные хранились в той же стране, что и их организация, и поэтому нам нужно иметь возможность обслуживать несколько баз данных.

Ответ №3:

Я несколько раз следил за обсуждением в моей компании, и они говорили о поддержке spring для этого.

Некоторые вещи, которые могут вас заинтересовать: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing / http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/aop/target/HotSwappableTargetSource.html

AbstractRoutingDataSource кажется интересным для вашего случая. Кто-то также сказал, что это, возможно, отключит 2-й кэш гибернации, для подтверждения…

Ответ №4:

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

В hibernate фильтры помогают вам сделать это…

Смотрите: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

Это ссылка на play Framework, но она использует hibernate, так что вы могли бы сделать почти то же самое с классическими материалами Java EE…

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

1. @Себастьян Лорбер — Jip, это то, что мы реализовали. Это называется многопользовательской арендой на основе дискриминатора.