2010-10-04 2 views
16

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

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

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

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

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

ответ

8

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

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


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

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

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

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

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

Какой кеш?

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

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

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

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

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

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

+0

Привет, Паскаль, Спасибо за ваш ответ. Все базы данных имеют одну и ту же схему, поэтому один SessionFactory для всех этих баз данных будет в порядке. Hibernate имеет кеш второго уровня, который может содержать недопустимые кэшированные данные, если я загружаю 2 уникальных объекта из двух разных баз данных, но с одинаковыми идентификаторами. Я думаю, что я могу заставить это работать, связав DataSource с HttpSession и используя Interceptor для присоединения DataSource в HttpSession к ThreadLocal, чтобы мой абстрактный объект AbstractDataSource смог получить правильные DS для транзакции. – Dzhu

+0

+1 для статьи Кена ДеЛонга - это спасло мне несколько головных болей :-) – opyate

1

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

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

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

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

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