2012-09-13 13 views
7

मेरे पास निम्न समस्या है: दो अलग-अलग प्रणालियों पर किसी एप्लिकेशन के दो उदाहरणों को एक छोटा डेटाबेस साझा करना चाहिए। मुख्य समस्या यह है कि दोनों सिस्टम केवल नेटवर्क-फ़ोल्डर के माध्यम से डेटा का आदान-प्रदान कर सकते हैं। मेरे पास कहीं डेटाबेस-सर्वर सेट करने की संभावना नहीं है।एच 2 डाटाबेस एकाधिक कनेक्शन

क्या नेटवर्क-फ़ोल्डर पर एच 2 डेटाबेस रखना संभव है और दोनों उदाहरण डेटाबेस से कनेक्ट होने दें (साथ ही साथ)?

अगर मैं फ़ाइल लॉकिंग अक्षम करता हूं, तो मैं एम्बेडेड मोड का उपयोग कर दोनों उदाहरणों से डीबी में कनेक्ट कर सकता हूं, है ना? उदाहरण डीबी पर या तो पढ़ या INSERT संचालन से छुटकारा पा सकते हैं। क्या मैं एकाधिक समवर्ती एम्बेडेड कनेक्शन का उपयोग कर डेटा भ्रष्टाचार का जोखिम उठाता हूं?

उत्तर

2

From H2 documentation:

यह भी ताला फ़ाइल के बिना डेटाबेस को खोलने के लिए संभव है; इस मामले में यह डेटाबेस फ़ाइलों की सुरक्षा के लिए अनुप्रयोग पर निर्भर है। ऐसा करने में विफल होने के परिणामस्वरूप दूषित डेटाबेस होगा।

मुझे लगता है कि मैंने पाया है, तो आपके आवेदन उपयोग हमेशा एक ही विन्यास (नेटवर्क फ़ोल्डर पर साझा की गई फ़ाइल डेटाबेस), तो आपको एक आवेदन परत है कि संगामिति का प्रबंधन करता है

+0

मैं यह पहले से ही पढ़ा है, लेकिन मैं यह भी तालिका स्तर लॉकिंग समर्थन के बारे में कुछ पढ़ा। क्या मैं सही हूं कि टेबल लॉकिंग केवल क्लाइंट/सर्वर मोड में उपयोग की जाती है? एकाधिक एम्बेडेड कनेक्शन के लिए, अपना लॉकिंग तंत्र लागू करना एकमात्र विकल्प है? – Dirk

+0

यदि आप कोई सर्वर चला सकते हैं, तो यह तालिका स्तर लॉकिंग का प्रबंधन करता है। लेकिन इसके बिना, आपको अपने स्वयं के तंत्र को लागू करना होगा –

+1

दरअसल, यदि आप डेटाबेस से एक से अधिक कनेक्शन खोलते हैं (उसी प्रक्रिया के भीतर), तो तालिका स्तर ताले डिफ़ॉल्ट रूप से एम्बेडेड और इन-मेमोरी मोड में भी उपयोग किए जाते हैं। –

21

मैं एक ही मुद्दा था बनाने के लिए और की जरूरत है दस्तावेज में समाधान। यह पाया जा सकता है; http://h2database.com/html/features.html#auto_mixed_mode

एकाधिक प्रक्रियाएं सर्वर को मैन्युअल रूप से प्रारंभ किए बिना समान डेटाबेस तक पहुंच सकती हैं। ऐसा करने के लिए, संलग्न करें; AUTO_SERVER = डेटाबेस URL के लिए सही। आप एक ही डेटाबेस यूआरएल का उपयोग स्वतंत्र से कर सकते हैं कि डेटाबेस पहले से खुला है या नहीं। यह सुविधा इन-मेमोरी डेटाबेस के साथ काम नहीं करती है।

// Application 1: 
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE"); 

// Application 2: 
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE"); 
संबंधित मुद्दे