Подтвердить что ты не робот

Многопользовательские источники данных - Spring + Hibernate

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

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

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

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

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

4b9b3361

Ответ 1

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

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


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

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

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

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

но не будет ли этот эффект кэшем Hibernate?

Какой кеш?

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

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

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

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

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

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

Ответ 3

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

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

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

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

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