2010-10-04 11 views
16

मैं एक वेब ऐप लिख रहा हूं जो एकाधिक उपयोगकर्ताओं का समर्थन करता है। H2 का उपयोग करके प्रत्येक उपयोगकर्ता का अपना डेटाबेस होता है। सभी डेटाबेस स्कीमा एक ही हैं।मल्टी-उपयोगकर्ता डेटासोडर्स - स्प्रिंग + हाइबरनेट

मैं इस एप्लिकेशन के लिए स्प्रिंग + हाइबरनेट का उपयोग करना चाहता हूं।

तो मैं उस उपयोगकर्ता के साथ किसी उपयोगकर्ता के डेटाबेस को कैसे जोड़ सकता हूं - शायद इसे HTTPSession में संबद्ध कर सकता हूं, और वसंत के सार RoutingDataSource का विस्तार कर सकता हूं? लेकिन क्या यह हाइबरनेट के कैश को प्रभावित नहीं करेगा? एक और तरीका है प्रत्येक डेटासोर्स के साथ सत्र फैक्ट्री रखना, भले ही प्रत्येक डेटास्रोत की स्कीमा एक जैसी हो ... इसलिए मैं इसे अपशिष्ट के रूप में देखता हूं।

किसी भी प्रकार डेटासेट को चुनने की आवश्यकता गतिशील होने की आवश्यकता है - उन्हें संदर्भ फ़ाइलों में पूर्व-कॉन्फ़िगर नहीं किया जा सकता है, क्योंकि प्रत्येक नए उपयोगकर्ता का अपना डेटाबेस बनाया जाएगा। क्या कोई मौजूदा ढांचा/समाधान है?

मुझे हाइबरनेट शर्ड्स के बारे में बहुत कुछ पता नहीं है, शायद यह काम करता है?

उत्तर

8

मैं के बारे में (सख्त) गलत हो सकता है, जैसा कि कुछ संसाधनों ने सुझाव दिया, एक SessionFactory डेटाबेस प्रति की आवश्यकता है:

मैं कुछ समय लगेगा सब कुछ कल फिर से पढ़ने के लिए (मैं सभी विवरण ईमानदारी से नहीं मिला) और पूरी तरह से इस तरह के एक सेटअप के निहितार्थ को समझने के लिए (हालांकि यह स्पष्ट लगता है कि यह दूसरे स्तर के कैश तोड़ देगा)। मैं बाद में इस पर वापस आऊंगा।


मैं एकाधिक उपयोगकर्ताओं का समर्थन करता है कि एक वेब अनुप्रयोग लिख रहा हूँ। H2 का उपयोग करके प्रत्येक उपयोगकर्ता का अपना डेटाबेस होता है। सभी डेटाबेस स्कीमा एक ही हैं।

मुझे आश्चर्य है कि यह कैसे स्केल करेगा ... आपके पास कितने उपयोगकर्ता हैं? आप एच 2 कैसे चलाते हैं, किस मोड में?

तो मैं उस उपयोगकर्ता के साथ उपयोगकर्ता के डेटाबेस को कैसे जोड़ सकता हूं - शायद इसे HTTPSession में संबद्ध करता हूं, और वसंत के सार RoutingDataSource का विस्तार करता हूं?

आप उपयोगकर्ता प्रति एक SessionFactory निर्माण करने के लिए और लॉग इन उपयोगकर्ता के लिए संबद्ध (एक Map में, कुंजी के रूप में लॉगिन का उपयोग करके) और फिर एक दिया SessionFactory से एक Session प्राप्त होगा। HTTP सत्र में SessionFactory के जीवन चक्र को बाध्य करना एक अच्छा विचार है (कुछ स्मृति को बचाने के लिए) लेकिन मुझे यकीन नहीं है कि वसंत यहां बहुत उपयोगी होगा। मैं गलत हो सकता हूं लेकिन HibernateUtil वर्ग की भिन्नता और एक पूरी तरह से प्रोग्रामेटिक दृष्टिकोण आसान दिखता है। मुझे यकीन नहीं है कि आपको प्रति उपयोगकर्ता एकाधिक कनेक्शन की आवश्यकता होगी।

लेकिन क्या यह हाइबरनेट के कैश को प्रभावित नहीं करेगा?

कैश कैश?

एक और तरीका प्रत्येक डेटासोर्स के साथ सत्र कारखाना होना है, भले ही प्रत्येक डेटास्रोत की स्कीमा समान है ... तो मैं इसे अपशिष्ट के रूप में देखता हूं।

ओह, यह एक अपशिष्ट है, लेकिन यही वह है जो आप करना चाहते हैं (प्रति उपयोगकर्ता एक डेटाबेस)। और आपके पास विकल्प नहीं है (आपको एक SessionFactory प्रति डाटाबेसबेस की आवश्यकता है)। आपको वास्तव में प्रति उपयोगकर्ता एक डेटाबेस की आवश्यकता क्यों है? क्या आप वाकई एक बुद्धिमान निर्णय लेते हैं? जैसा कि पहले ही संकेत दिया गया है, इसका मतलब है कि बहुत परेशानी होती है, अच्छी तरह से स्केल नहीं होती है, जटिलता जोड़ती है, आदि। एक डेटाबेस का उपयोग क्यों नहीं करते और उपयोगकर्ता को डेटा संबद्ध नहीं करते?

किसी भी प्रकार डेटासॉर को चुनने के लिए गतिशील होने की आवश्यकता है - उन्हें संदर्भ फ़ाइलों में पूर्व-कॉन्फ़िगर नहीं किया जा सकता है, क्योंकि प्रत्येक नए उपयोगकर्ता का अपना डेटाबेस बनाया जाएगा। क्या कोई मौजूदा ढांचा/समाधान है?

नहीं मेरी जानकारी के लिए

। यही कारण है कि मुझे लगता है कि आपको प्रोग्रामिंग के अनुसार सबकुछ करना होगा।

मुझे हाइबरनेट शर्ड्स के बारे में बहुत कुछ पता नहीं है, शायद यह काम करता है?

आपके आवेदन की गतिशील आवश्यकताओं को देखते हुए, मुझे नहीं लगता कि यह कैसे मदद कर सकता है।

+0

हाय पास्कल, आपके उत्तर के लिए धन्यवाद। सभी डेटाबेस में एक ही स्कीमा है, इसलिए इन सभी डेटाबेस के लिए एक सत्र फैक्ट्री ठीक रहेगी। हाइबरनेट में द्वितीय स्तर का कैश होता है, जिसमें अमान्य कैश डेटा हो सकता है यदि मैं 2 अलग-अलग डेटाबेस से 2 अद्वितीय इकाइयों को लोड करता हूं लेकिन एक ही आईडी के साथ। मुझे लगता है कि मैं डेटासोर्स को एचटीपीएसशन के साथ जोड़कर और एचटीपीएसशन में डेटासोर्स को थ्रेडलोकल में संलग्न करने के लिए एक इंटरसेप्टर का उपयोग करके इसे प्राप्त करने के लिए प्राप्त कर सकता हूं ताकि मेरा सारडेटा स्रोत प्रसंस्करण लेनदेन के लिए सही डीएस प्राप्त कर सके। केन DeLong लेख के लिए – Dzhu

+0

+1 - यह मुझे कुछ सिरदर्द बचाया :-) – opyate

1

2 लोगों (पास्कल और org.life.java) की मदद के लिए धन्यवाद!

यह संभव है, लेकिन कुछ समस्याओं के साथ: उदा। हाइबरनेट द्वितीय स्तर कैश/क्वेरी कैश।

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

यह लिंक पास्कल द्वारा आपूर्ति की एक बहुत अच्छा स्रोत है।

प्रत्येक उपयोगकर्ता को एक अलग डेटाबेस देने के लिए मेरा मुख्य प्रेरणा इसलिए है क्योंकि डेटा तेजी से बढ़ने की संभावना है, इस प्रकार क्षैतिज विभाजन की आवश्यकता है।

संबंधित मुद्दे