Вопрос

Мне было предъявлено требование, согласно которому мне нужно поддерживать несколько баз данных в одном экземпляре для поддержки мультитенантности.Каждая БД имеет идентичную схему.Пользователь входит в определенную базу данных, выбирая ее из списка, и все последующие вызовы будут поступать в эту БД до тех пор, пока он не выйдет из системы.

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

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

Какой самый простой способ сделать это?Настроить HotSwappableTarget для DaoTemplate?Может ли кто-нибудь указать мне образцы того, как это сделать?

Это было полезно?

Решение

Если все базы данных идентичны, я могу предложить использовать одну SessionFactory и предоставить свои собственные реализации для DataSource и Cache, которые на самом деле «с учетом арендаторов».(Реализовать их довольно тривиально:просто сохраните карту идентификатора арендатора -> реальный кеш/реальный источник данных, а затем делегируйте все вызовы соответствующему).Настройте одну SessionFactory для использования кэша и источника данных с поддержкой арендатора.ThreadLocal можно использовать, чтобы сделать идентификатор клиента текущего запроса доступным для любого кода, которому необходимо о нем знать.

Раньше я успешно использовал этот подход для поддержки мультиарендности.

Другие советы

Там, где я работал, мы делали это через ThreadLocal, следуя это руководство. Мы просто использовали одну SessionFactory и поменяли ее источник данных на основе переменной сеанса, которую пользователь мог изменить при входе в систему.Я не помню точных деталей, но если вам интересно, я могу найти дополнительную информацию о нашей реализации.

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

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

Вы также можете взглянуть на проект Hibernate Shards:

http://www.hibernate.org/414.html

...который ориентирован на добавление поддержки горизонтального секционирования в Hibernate Core.Он еще не охватывает весь API Hibernate, но поддерживает большую его часть (которой может быть достаточно или недостаточно для ваших нужд).Конечно, они работают над полным охватом.

Я также попробовал поставщика кеша через ThreadLocal, и самая сложная часть заключалась в горячей замене кеша: вы должны убедиться, что с SessionFactory не связано никаких активных сеансов.Теперь я думаю, что есть гораздо лучшее решение:Используя конфигурацию Java Spring 3, вы можете динамически создать сеансовую фабрику SessionFactory с поддержкой арендатора и позволить Spring выполнять управление кешем за вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top