Arhn - архитектура программирования

Динамический выбор базы данных на основе сеанса

Я использую JPA и WildFly 10.

Представьте, что у двух разных компаний есть подписки на использование моего приложения. В идеале я хотел бы разделить данные двух компаний на отдельные базы данных или, по крайней мере, на таблицы с отдельными префиксами, используя JPA. Если пользователь входит на http://example.com/company1/, создается впечатление, что приложение полностью отделен от приложения, работающего по адресу http://example.com/company2/, хотя на самом деле «два» приложения являются частью одного приложения.

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

Основная причина разделения данных на отдельные таблицы или базы данных — лучшая организация. Причиной использования одного приложения вместо нескольких является возможность горизонтального масштабирования.

Я видел ответы, в которых указано состояние для создания нескольких файлов persistence.xml, однако мое приложение должно динамически создавать и удалять базы данных или таблицы на основе текущих активных подписок. Думайте об этом как о веб-хостинговой компании, где, как только вы заплатите, вы можете войти в систему и начать работу на своем веб-сайте; это то направление, в котором я двигаюсь. Поэтому я не могу жестко запрограммировать разные компании в программе.

Как это можно сделать с помощью JPA? Это вообще возможно? Или есть лучший способ выполнить то, что я ищу?


Ответы:


1

Вы пытаетесь сделать свое приложение многопользовательским. Я знаю один способ:

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

  • затем используйте функцию фильтрации Hibernate для автоматической фильтрации данных, относящихся к арендатору. После активации фильтра каждый запрос будет возвращать только данные, относящиеся к текущему арендатору.

Примечание. Фильтр Hibernate установлен для объекта Hibernate Session. Если вы используете чистый JPA, интерфейс Entity Manager имеет метод с именем getDelegate(), который возвращает объект сеанса Hibernate.

Здесь находится ссылка на информацию о фильтрах гибернации. Есть также учебные пособия по их использованию в Интернете.

16.07.2016
  • FWIW Если вы используете чистый JPA,... getDelegate() возвращает сеанс Hibernate... что, в свою очередь, означает, что вы привязаны к поставщику JPA. 16.07.2016
  • @NeilStockton Вы правы. Это расширение для конкретного провайдера. JPA не имеет встроенной возможности фильтрации. Если у вас есть лучшее решение, я тоже хотел бы это знать. 16.07.2016
  • @ujulu Что ты об этом думаешь? tomas-dvorak.cz/posts/jpa-multitenancy 16.07.2016
  • Я попробую и опубликую его как ответ, если он сработает. 16.07.2016
  • @MitchTalmadge Это не лучшее решение. Представьте, что структура вашей базы данных одинакова (например, одинаковая структура таблицы для всех арендаторов). Затем, когда вы хотите внести изменения в свою схему, вы должны добавить эти изменения во все схемы и так далее. Это будет настоящая головная боль. У меня было это решение в проекте, и нам пришлось переключиться на решение фильтра. 16.07.2016
  • @ujulu Я не думал об этом. Однако станут ли запросы со временем медленнее, если все данные будут собраны вместе, чем если бы они были разделены схемой? Также кажется немного более рискованным иметь все данные вместе. Если бы какой-нибудь неприятный жук уничтожил его, он бы исчез для всех. 17.07.2016
  • @MitchTalmadge Размер данных может повлиять на производительность. Но в системах баз данных есть оптимизаторы, если вы используете их правильно. If some nasty bug wiped it out it'd be gone for everyone: такое может случиться. Но у вас должна быть резервная копия ваших данных для таких случаев. 17.07.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..