Multi-user Datasources-Spring + Hibernate

Piszę aplikację internetową, która obsługuje wielu użytkowników. Każdy użytkownik ma własną bazę danych-używając H2. wszystkie schematy bazy danych są takie same.

Chcę użyć Spring + Hibernate dla tej aplikacji.

Więc utknąłem w tym, jak powiązać bazę danych użytkownika z tym użytkownikiem-może powiązać ją w HTTPSession i rozszerzyć AbstractRoutingDataSource springa? ale czy nie spowoduje to hibernacji pamięci podręcznej? Innym sposobem jest mieć SessionFactory z każdym źródłem danych, nawet jeśli każdy schemat datasource jest taki sam... widzę to jako marnotrawstwo.

W każdym razie wybór źródła danych musi być dynamiczny - nie mogą być wstępnie skonfigurowane w plikach kontekstowych, ponieważ każdy nowy użytkownik będzie miał własną bazę danych utworzoną. Czy istnieją jakieś istniejące frameworki/rozwiązania?

Nie wiem zbyt wiele o Hibernate Shards, może to zadziała?

Author: Ahmed Ashour, 2010-10-04

3 answers

I może się mylić co do (ścisłej) potrzeby posiadania jednego SessionFactory Na bazę danych, jak sugerują niektórzy zasoby:

Poświęcę trochę czasu, aby ponownie przeczytać wszystko jutro (nie dostałem wszystkie szczegóły, aby być szczerym) i w pełni zrozumieć konsekwencje takiej konfiguracji (chociaż wydaje się jasne, że złamie pamięć podręczną drugiego poziomu). Wrócę później.


Piszę aplikację internetową, która obsługuje wielu użytkowników. Każdy użytkownik ma własną bazę danych-używając H2. wszystkie schematy bazy danych są takie same.

Zastanawiam się, jak to będzie skalowane... Ilu masz użytkowników? Jak uruchomić H2, jaki tryb?

Więc utknąłem w tym, jak powiązać bazę danych użytkownika z tym użytkownikiem - może powiązać ją z HTTPSession i rozszerzyć AbstractRoutingDataSource springa?

Musisz zbudować SessionFactory dla każdego użytkownika i powiązać go z zalogowanym użytkownikiem (w Map, używając klucza login jako), a następnie uzyskać Session z danego SessionFactory. Powiązanie cyklu życia SessionFactory z sesją HTTP wydaje się być dobrym pomysłem (aby zaoszczędzić trochę pamięci), ale nie jestem pewien, czy Spring będzie tu bardzo pomocny. Może się mylę, ale odmiana Klasa HibernateUtil i w pełni programowe podejście wyglądają łatwiej. Nie jestem pewien, czy będziesz potrzebował wielu połączeń na użytkownika przy okazji.

Ale czy nie spowoduje to hibernacji pamięci podręcznej?

Jaki cache?

Innym sposobem jest posiadanie SessionFactory z każdym źródłem danych, nawet jeśli schemat każdego źródła danych jest taki sam... widzę to jako marnotrawstwo.

Oh, to marnotrawstwo, ale to jest to, co chcesz zrobić (jedna baza danych na użytkownika). A ty nie masz wybór (potrzebujesz jednego SessionFactory Na datadabase). Dlaczego potrzebujesz jednej bazy danych na każdego użytkownika? Jesteś pewien, że to mądra decyzja? Jak już wspomniano, oznacza to wiele problemów, nie skaluje się dobrze, dodaje złożoności itp. Dlaczego nie użyć jednej bazy danych i nie powiązać danych z użytkownikiem?

W każdym razie wybór źródła danych musi być dynamiczny - nie mogą być wstępnie skonfigurowane w plikach kontekstowych, ponieważ każdy nowy użytkownik będzie miał własną bazę danych utworzoną. Czy istnieją jakieś frameworki/rozwiązania?

Nie wiem. Dlatego też myślę, że będziesz musiał robić wszystko programowo.

Nie wiem zbyt wiele o odłamkach Hibernate, może to zadziała?

Biorąc pod uwagę dynamiczne potrzeby Twojej aplikacji, Nie wiem, jak mogłaby pomóc.

 8
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 22:31:17
 3
Author: Jigar Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:11

Dzięki pomocy 2 osób (Pascal i org.życie.java)!

Jest to możliwe, ale z pewnymi problemami: np. bufor 2 poziomu hibernate/bufor zapytań.

Ten link dostarczony przez Pascala jest bardzo dobrym zasobem:

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

Moją główną motywacją do udostępnienia każdemu użytkownikowi osobnej bazy danych jest to, że dane mogą szybko rosnąć, więc poziome partycjonowanie jest wymagane.

 1
Author: Dzhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 09:09:09