Я столкнулся с серьезной проблемой в архитектуре моего корпоративного приложения. Мое текущее приложение - это веб-приложение с использованием spring framework 3.2+
и jpa 2.0
. Теперь мне нужно поддерживать многократную аренду в текущем приложении.
Мое требование состоит в том, что, когда пользователь вошел в систему, данные для пользователя должны быть поданы из соответствующей базы данных. Короче, мне нужна поддержка нескольких баз данных, которая может вызвать различную строку соединения. Итак, как я могу динамически подключаться к базе данных?
Моя еще одна проблема заключается в том, что арендатор (конкретный клиент приложений) может зарегистрировать себя "на лету", и при успешной регистрации мне нужно создать среду, содержащую создание и инициализацию базы данных и т.д. Для этого арендатора и для успешного создания пользователей среды арендаторов доступ к приложению. Итак, проблема в том, как динамически создавать среду, как динамически создавать EntityManagerFactory
?
Любые предложения по достижению многократной аренды наиболее приветствуются...
В веб-среде многопользовательская аренда может быть реализована с созданием псевдонимов, специфичных для арендаторов, которые должны быть определены в вашем файле /etc/hosts или Windows\System32\drivers\etc\hosts, чтобы сопоставлять узлы, связанные с арендатором, с тот же контейнер сервлетов.
Как только вы это сделаете, вы можете определить фильтр сервлета, который будет читать текущий используемый хост и сравнить его с другим сопоставлением, которое будет определено в файле свойств, например, и заполнить параметр сеанса HTTP, указывающий текущего арендатора.
Здесь у вас есть арендатор на сессии.
Вы должны настроить таргетинг на общую базу данных и конкретную таблицу "tenant_database". В этой таблице должны быть указаны имя базы данных, пароль, порт и т.д. Вся информация о источнике данных устанавливается для подключения к целевой базе данных арендаторов.
На этом этапе вы можете создать entityManagerFactory:
Map<String, String> properties = new HashMap<String, String>();
properties.put("javax.persistence.jdbc.user", "admin");
properties.put("javax.persistence.jdbc.password", "admin");
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
"jdbc:mysql://localhost:3306/myDB", properties);
Вам просто нужно подумать о том, чтобы получить его с нужного места сейчас.. :)
Надеюсь, поможет