Я может быть неправильным о (строгой) должны иметь один SessionFactory
для каждой базы данных, как это было предложено несколько ресурсов:
Я занять некоторое время, чтобы перечитать все завтра (я не получил все детали, чтобы быть честным) и в полной мере понять последствия такой установки (хотя это кажется очевидным, что он сломает кеш второго уровня). Я вернусь к этому позже.
Я пишу веб-приложение, которое поддерживает несколько пользователей. Каждый пользователь имеет свою собственную базу данных - используя H2. все схемы баз данных одинаковы.
Интересно, как это будет масштабироваться ... Сколько у вас пользователей? Как вы запускаете H2, какой режим?
Итак, я застрял в том, как связать базу данных пользователя с этим пользователем - возможно, связать ее с HTTPSession и расширить SpringRoutingDataSource от Spring?
Вы должны построить SessionFactory
для каждого пользователя и связать его с вошедшего пользователя (в Map
, используя логин как ключ), а затем получить Session
от данного SessionFactory
. Связывание жизненного цикла SessionFactory
с сеансом HTTP кажется хорошей идеей (чтобы сохранить некоторую память), но я не уверен, что Spring будет очень полезен здесь. Возможно, я ошибаюсь, но выбор класса HibernateUtil
и полностью программный подход выглядят проще. Я не уверен, что вам понадобится несколько подключений для каждого пользователя.
но не будет ли этот эффект кэш-памяти Hibernate?
Какой кеш?
Другой способ состоит в том, чтобы иметь SessionFactory с каждым источником данных, хотя каждая схема источника данных одинакова ... поэтому я вижу это как отходы.
О, это пустая трата, но это то, что вы хотите сделать (одна база данных для каждого пользователя). И у вас нет выбора (вам нужен один SessionFactory
за datadabase). Зачем вам нужна одна база данных для каждого пользователя? Вы уверены, что это мудрое решение? Как уже намекнул, это означает много проблем, не будет хорошо масштабироваться, добавляет сложности и т. Д. Почему бы не использовать одну базу данных и связать данные с пользователем?
Anyways, выбирающий источник данных, должен быть динамическим - они не могут быть предварительно сконфигурированы в контекстных файлах, так как каждый новый пользователь будет иметь свою собственную базу данных. Существуют ли какие-либо существующие рамки/решения?
Насколько мне известно. Именно поэтому я думаю, что вам нужно будет делать все программно.
Я не знаю слишком много о Hibernate Shards, может быть, это работает?
Учитывая динамические потребности вашего приложения, я не вижу, как это может помочь.
Привет, Паскаль, Спасибо за ваш ответ. Все базы данных имеют одну и ту же схему, поэтому один SessionFactory для всех этих баз данных будет в порядке. Hibernate имеет кеш второго уровня, который может содержать недопустимые кэшированные данные, если я загружаю 2 уникальных объекта из двух разных баз данных, но с одинаковыми идентификаторами. Я думаю, что я могу заставить это работать, связав DataSource с HttpSession и используя Interceptor для присоединения DataSource в HttpSession к ThreadLocal, чтобы мой абстрактный объект AbstractDataSource смог получить правильные DS для транзакции. – Dzhu
+1 для статьи Кена ДеЛонга - это спасло мне несколько головных болей :-) – opyate