Несколько сессионных фабрик под Spring / Hibernate - PullRequest
8 голосов
/ 23 сентября 2008

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 28 сентября 2008

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

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

2 голосов
/ 23 сентября 2008

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

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

1 голос
/ 05 июля 2009

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

0 голосов
/ 15 января 2010

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

0 голосов
/ 23 сентября 2008

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

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

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

...