2009-06-22 21 views
7

के साथ SQLite क्लाइंट डेटाबेस को सिंक्रनाइज़ करना मैंने SQL सर्वर के साथ xq में एक ऐप बनाया है। मैं अपने सर्वर में अपने mysql डेटाबेस के साथ सिंक करने के लिए सिंक नामक एक बटन बनाना चाहता हूं। सिंक प्रक्रिया के बारे में कोई सुझाव? कृपया मुझे बताओ।एक MySQL सर्वर डेटाबेस

+0

आप निर्माण टेबल के एक छोड़ने सिंक करने के लिए तैयार है है? – Macarse

+0

हाँ ... इसका मतलब है कि जब भी मुझे इसकी आवश्यकता होगी सर्वर के साथ सिंक करना चाहते हैं ... वायरलेस लेनदेन के माध्यम से पीसी से आईफोन कनेक्ट नहीं – user123589

+0

क्या यह दो-तरफा सिंक है? क्या सर्वर और क्लाइंट दोनों सिंक के बीच में रिकॉर्ड, पढ़, अपडेट और हटाए जा सकते हैं? (संकेत: यदि आप संभवतः कर सकते हैं तो आप इस प्रश्न के लिए "नहीं" का जवाब देना चाहते हैं।) – cduhn

उत्तर

4

स्कीमा संस्करण संख्या और अंतिम अद्यतन टाइमडेट स्टैम्प दोनों को वापस करने के लिए सर्वर पर एक webservice का उपयोग करें। यदि ग्राहक पुराना है, तो यह अद्यतन स्कीमा और/या नया डेटा प्राप्त करने के लिए दूसरी कॉल करता है।

3

मेरा मानना ​​है कि आप कह रहे हैं कि आपके पास एक कंप्यूटर पर एक MySQL सर्वर चल रहा है और आप एक एसक्लाइट इंस्टेंस के साथ एक ऐप चला रहे हैं और यदि MySQL सर्वर पर नया डेटा है तो आप SQL सर्वर को अपडेट करना चाहते हैं।

मैं इसे इस तरह से

1) यकीन है कि दोनों अपने कंप्यूटर पर और ऐप्लिकेशन पर तालिका संरचना समान है सुनिश्चित करना होगा। एक अंतिम अद्यतन फ़ील्ड शामिल करें

2) यह जांचने के लिए कि कौन सबसे अद्यतित है, अपनी अनूठी कुंजी द्वारा अंतिम पंक्ति प्राप्त करें और फिर अद्यतन फ़ील्ड की तुलना करें।

3) जब सबसे अद्यतित क्षेत्र सर्वर से संबंधित होता है तो पता लगाएं कि कितनी पंक्तियां अलग हैं और उन्हें एक में कॉपी करना प्रारंभ करें ... जबकि() लूप या फिर आप पसंद करते हैं।

यदि आप सर्वर और क्लाइंट दोनों पर इस कोड को लागू करते हैं तो वे एक दूसरे को अपडेट कर सकते हैं या यदि आप केवल ग्राहक को अपडेट करना पसंद करते हैं।

विनिर्देश उस भाषा पर निर्भर हैं जिसका आप उपयोग करना चाहते हैं और उस समय की मात्रा जिसे आप विकास में रखना चाहते हैं।

+0

दिलचस्प है और मैं और सुनना चाहता हूं। क्योंकि मुझे वास्तव में नहीं पता कि कैसे शुरू किया जाए। मेरे पास एक कंप्यूटर पर मेरा एसक्यूएल सर्वर चल रहा है और मेरे पास एक एसक्लाइट उदाहरण है। मैं अपने ऐप में एक बटन सिंक बनाना चाहता हूं जो MySQL सर्वर से नया डेटा डाउनलोड करेगा। – ludo

+0

मुझे खेद है कि मैंने जवाब नहीं दिया। मेरे पास स्टैक ओवरफ़्लो पर लटकने का समय नहीं है जैसा कि मैंने किया था। –

0

कुछ सवाल:

  • आप एक दो-तरफा सिंक प्रयास कर रहे हैं, या बस सर्वर से अपडेट खींच?
  • क्या अपडेट ऑपरेशन स्वीकार्य हैं? डालें/अपडेट/हटाना चाहते हैं? प्रतिकृति डेटाबेस में, आमतौर पर हटाए जाते हैं।

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

यदि आप दो तरह से सिंकिंग करने की योजना बना रहे हैं, तो आपको विलय और संघर्ष समाधान के बारे में सोचना होगा। दो तरीकों से, प्रत्येक पक्ष के लिए लेन-देन कतार होना सर्वोत्तम होता है। बस डेटाबेस के खिलाफ निष्पादित प्रत्येक सीआरयूडी कथन रिकॉर्ड करें। समन्वयित करते समय, इन कथनों को लागू करें और फिर कतार को छोटा करें।

8

आपको पता है कि यह एक छोटी सी समस्या है। मैंने पिछले साल एक वाणिज्यिक ऐप के लिए इसे पूरा करने के लिए एक पुस्तकालय लिखा था और इसे पाने के लिए लगभग 6 महीने लग गए थे जहां मैं इससे खुश था।

फ़ायरवॉल और समर्थन समस्याओं से बचने के लिए पोर्ट 80 और HTTP (टीसीपी/आईपी) का उपयोग करने के लिए तर्क को छोड़कर, आपको प्रोटोकॉल डिज़ाइन करने की आवश्यकता है। चूंकि मेरी परियोजना बहुत डेटा intesive था, इसलिए मैं एक बाइनरी प्रोटोकॉल (bloated xml के बजाए) के साथ चला गया जो किसी भी डेटा को संभाल सकता है। मैं यह भी द्वि-दिशात्मक होना चाहता था ताकि मैं डेटा को इंसर्ट कर सकूं और अनुरोधों को निष्पादित कर सकूं। मैंने सर्वर पर सीजीआई/फास्टसीजीआई का इस्तेमाल किया।

मैंने डिजाइन किया गया बाइनरी प्रोटोकॉल काफी सरल है (हमेशा बेहतर) और उपयोगकर्ता परिभाषित आकार के हिस्सों में बड़े स्थानान्तरण को तोड़ता है (लगभग 600k अच्छा लगता है)। प्रत्येक खंड में डेटा के बाद एक शीर्षलेख होता है।

हालांकि इस प्रोटोकॉल का उपयोग किसी भी प्रकार के डेटा को प्रेषित करने के लिए किया जा सकता है, आमतौर पर इसका उपयोग डेटाबेस शैली डेटा के लिए किया जाता है क्योंकि आपका प्रश्न बताता है। इसे कम करने के लिए, मैंने डिजाइन के लिए पंक्तियों/कॉलम दृष्टिकोण का उपयोग करने का निर्णय लिया। डेटा एक समय में एक पंक्ति को संग्रहीत किया जाता है, प्रत्येक कॉलम पंक्ति एक के लिए संग्रहीत किया जाता है, फिर पंक्ति 2 के लिए सभी कॉलम ... पंक्ति n।

एक एकल स्तंभ डेटा का प्रारूप है:

' Col1Type   1Bytes - BYTE  ' Data Type (REMSQL_TEXT etc)     
' Col1Len   4Bytes - DWORD ' Length in bytes the Column Data       - up to 4.2GB 
' Col1Data   nBytes - BYTE  ' String data 

(सी में, एक बाइट CHAR है)

इसका मतलब यह है प्रत्येक स्तंभ डेटा प्रकार वर्णनकर्ता है।

REMSQL_NONE = 0 ' DataType undefined 
REMSQL_QUAD = 1 ' 64-bit signed integer     
REMSQL_DBLE = 2 ' 64-bit IEEE floating point number 
REMSQL_TEXT = 3 ' STRING - (CHAR) string of Ascii Bytes          
REMSQL_BLOB = 4 ' BLOB - (CHAR) string of Binary Bytes          
REMSQL_NULL = 5 ' NULL - Empty Column 

SQLite मौलिक डेटा प्रकार के साथ ये डेटा प्रकार सह incide और संख्यात्मक SQL3 मौलिक डेटाटाइप गणन के बराबर हैं: सभी डेटाटाइप्स साथ दर्शाया जा सकता है।

इस डिज़ाइन में, यदि कोई फ़ील्ड खाली है (न्यूल) तो आपने इसे स्टोर करने के लिए केवल 5 बाइट्स ले लिए हैं। उदाहरण के लिए यदि फ़ील्ड में टेक्स्ट के 200 बाइट हैं, तो इसे स्टोर करने में केवल 205 बाइट लगते हैं। बड़ा लाभ डेटा को पार्स करने में है क्योंकि छोड़ने वाले कॉलम को कुछ टर्मिनेंट कैरेक्टर खोजने के लिए सभी 200 बाइट्स के माध्यम से पढ़े बिना किया जा सकता है।

चंक हेडर में पंक्तियों की संख्या, कॉलम की संख्या, कुल बाइट इत्यादि जैसी चीज़ें होनी चाहिए। यदि आप डीडब्ल्यूओआरएस (हस्ताक्षरित 64 बिट पूर्णांक) का उपयोग करते हैं तो एक खंड के लिए सैद्धांतिक सीमा 4.2 गीगा है जो कि पर्याप्त भी होनी चाहिए स्थानीय नेटवर्क tranmission।

कार्यान्वयन के लिए इस कार्यक्षमता के लिए SQLite/MYSQL wrappers लिखने की आवश्यकता है। मैं द्विआधारी प्रोटोकॉल विशेष रूप से है, जो एक छोटे से समय लगता है का उपयोग करें, लेकिन आप अनिवार्य रूप से निम्नलिखित कार्य की जरूरत है: क्लाइंट साइड: SendRequest() - अनुरोध भेजता है, प्रतिक्रिया के लिए

सर्वर साइड इंतजार कर रहा है: ProcessRequest() - प्राप्त अनुरोध, प्रक्रियाओं यह प्रतिक्रिया देता है और प्रतिक्रिया

मेरे मामले में, प्रतिक्रिया 0000 डेटा या उससे अधिक हो सकती है। मैं MySQL से संपूर्ण डेटा सेट पुनर्प्राप्त करता हूं और इसे सर्वर पर डिस्क पर सहेजता हूं। फिर मैं एक खाली खंड वापस करता हूं जिसमें डेटा सेट मेट्रिक्स होते हैं। क्लाइंट तब 600k के हिस्सों में डेटा सेट का अनुरोध करता है, एक-एक करके। यदि कनेक्शन गुम हो जाता है, तो यह सिर्फ उस स्थान पर जाता है जहां यह छोड़ा गया था।

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

यह सब करने की प्रक्रिया में मैं एक बहुत तेज स्ट्रिंग बिल्डर वर्ग, एएसएम में एईएस एन्क्रिप्शन के एक कार्यान्वयन लिखते हैं, और एक पूरे FastCGI पुस्तकालय (www.coastrd.com)

तो जैसा कि मैंने कहा, गैर तुच्छ । मैं जल्द ही इस पुस्तकालय को उपलब्ध कराऊंगा। यदि आप इसे देखना चाहते हैं, तो मुझे ईमेल करें।

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

यदि आप अपना खुद लिखते हैं, तो कृपया अपने अनुभव के बारे में यहां वापस पोस्ट करें !

पीएस। अधिक खोज किए जाने की शीर्षक बदलने पर विचार अनुकूल .. शायद की तरह कुछ:

(हाइबरनेट का उपयोग कर जावा में)

0

SQuirreL एसक्यूएल "एक MySQL सर्वर डेटाबेस के साथ एक SQLite ग्राहक डेटाबेस सिंक्रनाइज़ किया जा रहा" इसे करने के लिए एक DBCopy प्लगइन है। इसका उपयोग कर डेटाबेस कॉपी को स्क्रिप्ट करना संभव हो सकता है। मैंने कोशिश नहीं की है, लेकिन यह पहली दिशा है जिसे मैं जाऊंगा।

0

entropyDb एक ऑटो प्रतिकृति सुविधा है जो संभाल सकता है इस

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