समवर्ती लेखन को SQLite डेटाबेस पर अनुमति क्यों नहीं दी जाती है?


79

मैं SQLite के साथ जावा का उपयोग कर डेटाबेस प्रोग्रामिंग कर रहा हूं।

मैंने पाया है कि डेटाबेस में एक समय में केवल एक कनेक्शन में लिखने की क्षमता होती है, जबकि कई कनेक्शन एक बार में पढ़ने की क्षमता रखते हैं।

SQLite की वास्तुकला इस तरह से क्यों बनाई गई थी? जब तक दो चीजें जो लिखी जा रही हैं, डेटाबेस में एक ही जगह नहीं लिखी जा रही हैं, तो एक साथ दो लेखन क्यों नहीं हो सकते?



5
क्योंकि SQLite को "लाइट" होने के लिए डिज़ाइन किया गया था। कम मेमोरी और प्रदर्शन के साथ कम प्रसंस्करण। सोचें कि कैसे आप SQLite को एक ही फाइल में कई राइट्स हैंडल करेंगे। वर्तमान डिजाइन को लागू करना आसान है - पूरी फाइल लॉक है और दूसरों को इंतजार करना पड़ता है। ग्रैन्युलैरिटी के निचले स्तर पर लिखने की क्षमता को संभालने के लिए पंक्ति / पृष्ठ लॉकिंग की आवश्यकता होती है जो आपको RDMS से मिलती है। यदि आवश्यकता मांगने के लिए संक्षिप्त नाम लिखते हैं, तो SQLite एक उम्मीदवार नहीं है और इसके बजाय, आपको हल्के RDBMS को देखना चाहिए: en.wikipedia.org/wiki/…
थॉमस कार्लिसल

जवाबों:


157

क्योंकि "एकाधिक समवर्ती लेखन" एकल लेखक, एकाधिक-पाठक की तुलना में मुख्य डेटाबेस इंजन में पूरा करने के लिए बहुत कठिन है। यह SQLite के डिजाइन मापदंडों से परे है, और इसमें SQLite की खुशी से छोटे आकार और सादगी को शामिल किया जाएगा।

लेखन संगणना की उच्च डिग्री का समर्थन बड़े डेटाबेस इंजनों जैसे कि DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL और Sybase की पहचान है। लेकिन तकनीकी रूप से यह पूरा करना कठिन है, इसके लिए डेटाबेस, टेबल और पंक्ति लॉकिंग जैसे व्यापक कंसीडर कंट्रोल और ऑप्टिमाइज़ेशन स्ट्रैटेजी की आवश्यकता होती है, या अधिक आधुनिक कार्यान्वयन में, मल्टी-वर्ज़न कंसीलर कंट्रोल । इस समस्या / आवश्यकता पर किया गया शोध स्वैच्छिक है और दशकों पीछे चला जाता है

SQLite में उन सर्वर-केंद्रित DBMS में से एक बहुत अलग डिज़ाइन दर्शन है जो कई लेखकों का समर्थन करता है। इसे अलग-अलग अनुप्रयोगों के लिए SQL और संबंधपरक मॉडल की शक्ति लाने के लिए डिज़ाइन किया गया है, और वास्तव में प्रत्येक एप्लिकेशन के भीतर एम्बेड किया जा सकता है। उस लक्ष्य के लिए महत्वपूर्ण व्यापार की आवश्यकता होती है। कई समवर्ती लेखकों को संभालने के लिए महत्वपूर्ण बुनियादी ढांचे और ओवरहेड को जोड़ना नहीं है।

दर्शन को SQLite के उचित उपयोग पृष्ठ पर एक बयान द्वारा अभिव्यक्त किया जा सकता है :

SQLite क्लाइंट / सर्वर डेटाबेस के साथ प्रतिस्पर्धा नहीं करता है। SQLite fopen () के साथ प्रतिस्पर्धा करता है।


41
+1। SQLite एक इन-प्रोसेस डेटाबेस है। सर्वर-आधारित डीबी में कोई केंद्रीय मध्यस्थ नहीं है। लेखकों को एक दूसरे के साथ सीधे सहयोग और विश्वास करना होगा। एक भी दुर्भावनापूर्ण लेखक सिर्फ सहयोग नहीं करके कहर बरपा सकता है।
जोर्ग डब्ल्यू मित्तग

12
इसके अलावा, कुछ वातावरण जो SQLite निष्पादित करते हैं, वे कई प्रक्रियाओं का समर्थन भी नहीं कर सकते हैं।
david25272

1
संभवतः एक दुर्भावनापूर्ण लेखन पहले से ही सहयोग न करके कहर बरपा सकता है। वे इसे करने के लिए SQLite कोड का उपयोग नहीं कर सकते हैं, लेकिन उनका अपना कोड हो सकता है, जो सिर्फ अनलिंक करने के लिए कॉल हो सकता है ()
bdsl

12
समवर्ती ऐप्स में, बहुत अधिक मध्यम जमीन नहीं है। चुनौतीपूर्ण परिस्थितियों और किनारे के मामलों सहित, या तो आपको आवश्यक रूप से 100% समय के लिए संगामिति, स्थिरता और डेटा अखंडता मिलती है, या आप नहीं करते हैं। यदि आप ऐसा नहीं करते हैं, तो यह नाजुक, धीमा और दुर्घटनाग्रस्त है, और लोग इस पर बहुत जल्दी भरोसा करना बंद कर देते हैं। लेकिन इसे नियमित रूप से सही होना बहुत मुश्किल है। ऐसी बहुत सी परिस्थितियाँ नहीं हैं जिनमें लेखक, मूल समर्थन के अनुपस्थित oodles को समन्वयित कर सकते हैं, अपने स्वयं के संवादों को समन्वित कर सकते हैं।
जोनाथन यूनिस

8
@bdsl किसी भी प्रकार के डेटाबेस को यह मानना होगा कि लेखकों का व्यवहार अच्छा नहीं होगा, इसलिए वे डेटा नहीं खोते हैं। लेखक SQLite इसे एक प्रतियोगी के रूप में स्थान देते हैं fopen(), इसलिए उन सभी बालों पर विचार करें जो समतल पाठ फ़ाइल में समवर्ती लेखन के साथ आते हैं।
ब्लरफ्ल

12

क्योंकि कोई सर्वर नहीं है जो यह बता सके कि चीजें एक ही जगह पर लिखी जानी हैं या नहीं। फ़ाइल में लिखने के लिए केवल दो प्रक्रियाएँ हैं।

जैसा कि एक टिप्पणी में कहा गया है, समवर्ती लेखन एक आंतरिक धागे द्वारा भी समर्थित हो सकता है। यह सुनिश्चित नहीं है कि यह कितना अच्छा काम करेगा (या तो इसके बारे में ज्यादा नहीं सोचा)। वैसे भी यहाँ क्यों SQLite धागे का उपयोग नहीं करता है: डॉ। हिप्प सोचता है कि धागे बुराई हैं।

तथ्य यह है कि डीआर हिप्प सोचता है कि थ्रेड्स बुराई हैं SQLite FAQ में दर्ज़ किया गया है ।


2
यह तकनीकी कारण बताता है कि समवर्ती लेखन की अनुमति क्यों नहीं है, लेकिन डिजाइन निर्णय क्यों नहीं किया गया था।
रॉबर्ट हार्वे

3
SQLite डिजाइन करने का निर्णय ताकि यह केवल एक समय में एक लिखने का काम करे।
रॉबर्ट हार्वे

7
@Goo को समवर्ती लिखने के लिए एक सर्वर की आवश्यकता नहीं होती है: जितना एक डेटाबेस सर्वर एक अलग प्रक्रिया है, SQLite के लिए एक अलग थ्रेड आंतरिक हो सकता है जो समान उद्देश्य प्रदान करता है। रॉबर्ट हार्वे सही है: SQLite टीम द्वारा बनाया गया एक डिजाइन निर्णय था, और समवर्ती लिखने के लिए एकल पुस्तकालय की क्षमता के साथ इसका कोई लेना-देना नहीं है (क्योंकि यह सिद्धांत में हो सकता है)।

1
यह उत्तर मुझे ठीक लगता है। समवर्ती लेखन को संभालने के लिए, ऐसा लगता है कि किसी को सर्वर, या एक बहु-थ्रेड साइक्लाइट कार्यान्वयन की आवश्यकता होगी। क्योंकि उन दोनों को अन्य डिजाइन निर्णयों द्वारा खारिज कर दिया गया है, इसलिए समवर्ती लेखन को लागू करना अत्यधिक कठिन होगा।
जपा

5
@jpa: SQLite पहले से ही एक "सर्वर" के बिना कई प्रक्रियाओं / थ्रेड्स के बीच लॉकिंग को सिंक्रनाइज़ करने का प्रबंधन करता है। एक "सर्वर" की आवश्यकता नहीं है - ओएस-प्रदान की गई लॉकिंग / सिंक्रोनाइज़ेशन / आईपीसी / जो भी पर्याप्त हो, का उपयोग करके, लेकिन जटिल वास्तविक तेज़ हो जाता है। पोस्ट में वर्णित "आंतरिक सूत्र" का कोई मतलब नहीं है।
Mat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.