Многопользовательские источники данных - Spring + Hibernate - PullRequest
16 голосов
/ 04 октября 2010

Я пишу веб-приложение, которое поддерживает несколько пользователей.Каждый пользователь имеет свою собственную базу данных - используя H2.все схемы базы данных одинаковы.

Я хочу использовать Spring + Hibernate для этого приложения.

Поэтому я застрял в том, как связать базу данных пользователя с этим пользователем - возможно, связать ее вHTTPSession и расширять SpringRoutingDataSource?но разве это не повлияет на кеш Hibernate?Другим способом является создание SessionFactory с каждым источником данных, даже если схема каждого источника данных одинакова ... поэтому я вижу, что это пустая трата.

В любом случае выбор источника данных должен быть динамическим - они не могут бытьпредварительно сконфигурированы в контекстных файлах, поскольку каждый новый пользователь будет иметь свою собственную базу данных.Существуют ли какие-либо фреймворки / решения?

Я не слишком много знаю о Hibernate Shards, может, это работает?

Ответы [ 3 ]

8 голосов
/ 05 октября 2010

I может ошибаться из-за (строгой) необходимости иметь один SessionFactory на базу данных, как предлагают некоторые ресурсы:

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


Я пишу веб-приложение, которое поддерживает несколько пользователей.Каждый пользователь имеет свою собственную базу данных - используя H2.все схемы баз данных одинаковы.

Интересно, как это будет масштабироваться ... Сколько у вас пользователей?Как вы запускаете H2, в каком режиме?

Итак, я застрял в том, как связать базу данных пользователя с этим пользователем - может быть, связать ее в HTTPSession и расширить SpringRoutingDataSource?

У вас будетпостроить SessionFactory для каждого пользователя и связать его с зарегистрированным пользователем (в Map, используя логин в качестве ключа), а затем получить Session из заданного SessionFactory.Привязка жизненного цикла SessionFactory к сеансу HTTP кажется хорошей идеей (для экономии памяти), но я не уверен, что Spring будет здесь очень полезен.Я могу ошибаться, но вариант класса HibernateUtil и полностью программный подход выглядят проще.Кстати, я не уверен, что вам понадобится несколько подключений для каждого пользователя.

но не скажется ли это на кеше Hibernate?

Какой кеш?

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

О,это пустая трата времени, но это то, что вы хотите сделать (одна база данных на пользователя).И у вас нет выбора (вам нужен один SessionFactory на базу данных).Зачем вам нужна одна база данных на пользователя?Вы уверены, что это мудрое решение?Как уже упоминалось, это означает, что много проблем, плохое масштабирование, сложность и т. Д. Почему бы не использовать единую базу данных и не связывать данные с пользователем?

В любом случае выбор источника данных должен быть динамичным- они не могут быть предварительно сконфигурированы в контекстных файлах, поскольку у каждого нового пользователя будет создана собственная база данных.Существуют ли какие-либо фреймворки / решения?

Мне не известно.Именно поэтому я думаю, что вам придется делать все программно.

Я не слишком много знаю об осколках гибернации, может, это работает?

Учитываядинамические потребности вашего приложения, я не понимаю, как это могло бы помочь.

3 голосов
1 голос
/ 06 октября 2010

Благодаря помощи двух человек (Pascal и org.life.java)!

Это возможно, но с некоторыми проблемами: например, спящий кэш 2-го уровня / кэш запросов.

Эта ссылка, предоставленная Pascal, является очень хорошим ресурсом:

http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...