2012-07-31 12 views
11

पढ़ने और लिखने के लिए धागे में कनेक्शन साझा करना मेरे पास एक ऐसा एप्लिकेशन है जो डेटा स्टोर करने के लिए SQLite (संस्करण 3.7.2) का उपयोग करता है। मेरे पास एक SQLite कनेक्शन है जो एकाधिक थ्रेड के बीच साझा किया गया है जो एक ही SQLite डीबी से लिखता है और पढ़ता है। SQLite DSQLITE_THREADSAFE = 1 के साथ संकलित है जिसका अर्थ है SQLite Serialized मोड में है।SQLite:

से SQLite docs

धारावाहिक का हवाला देते हुए: धारावाहिक मोड में, SQLite सुरक्षित रूप से कई द्वारा धागे कोई प्रतिबंध के साथ प्रयोग किया जा सकता है।

इसके विपरीत SQLite Wiki प्रविष्टि कहते हैं

से अधिक एक सूत्र में एक ही समय में एक ही डेटाबेस कनेक्शन

मैं एक नमूना अनुप्रयोग है कि spawns साथ की कोशिश की का प्रयोग न करें & पढ़ने के लिए सैकड़ों धागे और एक SQLite हैंडल साझा करते हैं जो ठीक काम कर रहा है।

तो क्या SQLite विकी प्रविष्टि पुरानी है या SQLite एक ही कनेक्शन का उपयोग कर एक ही समय में अलग-अलग धागे से पढ़ने और लिखने को संभालने में सक्षम नहीं हो सकता है?

उत्तर

7

संपादित

DSQLITE_THREADSAFE = 2: बहु धागा मोड शब्द "बहु धागा" थोड़ा SQLite में उलझन में है। मल्टी-थ्रेड मोड में लगता है कि आप अन्य धागे के साथ कनेक्शन साझा नहीं कर सकते हैं क्योंकि कनेक्शन स्वयं एक थ्रेड को कनेक्शन को संशोधित करने के लिए म्यूटेक्स का उपयोग नहीं करेगा, जबकि दूसरा थ्रेड इसका उपयोग कर रहा है।

DSQLITE_THREADSAFE = 1: धारावाहिक मोड हालांकि, धारावाहिक मोड में है, यह datafile लॉक हो जाएगा और साझा कनेक्शन के लिए पहुँच को नियंत्रित करने mutexes का प्रयोग करेंगे।

दस्तावेज़ों से: ... जब SQLite SQLITE_THREADSAFE = 1 के साथ संकलित किया गया है, तो SQLite लाइब्रेरी स्वयं डेटाबेस कनेक्शन और तैयार कथन तक पहुंच को क्रमबद्ध कर देगी ताकि एप्लिकेशन एक ही डेटाबेस कनेक्शन या एक ही तैयार कथन का उपयोग करने के लिए स्वतंत्र हो एक ही समय में विभिन्न धागे में।

तो, जब कनेक्शन के साथ काम कर, धारावाहिक मोडधागा सुरक्षित लेकिन बहु धागा मोड नहीं है, हालांकि आप अभी भी एक ही डाटाबेस के लिए कई कनेक्शन है कर सकते हैं।

स्रोत: http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

सादर!

+2

मैंने इसे पढ़ा, लेकिन मैं सोच रहा था कि विकी पुराना था या SQLite कनेक्शन अब एकाधिक धागे से उसी कनेक्शन से 'रीड' और 'लिखने' का समर्थन करता है? – omggs

+0

@omggs आप सही हैं। SQLite दस्तावेज़ों में शर्तें थोड़ा उलझन में हैं। मेरे लिए * बहु-थ्रेड * और * धारावाहिक * वही था, लेकिन वे नहीं हैं। मैं धारावाहिक कनेक्शन का उपयोग करता हूं लेकिन उन्हें धागे के बीच साझा नहीं करता ... और अब मैंने सीखा है कि यह साझा करना सुरक्षित है :) – devundef

+1

पुष्टि करने के लिए धन्यवाद! SQLite विकी वास्तव में पुराना है !!! – omggs

0

एक से अधिक थ्रेड के बीच एक कनेक्शन साझा करने के एक बुरा विचार है, जब आपके पास DSQLITE_THREADSAFE = 0

अपने थ्रेड कल्पना कीजिए 1 इस कोड को क्रियान्वित किया जाता है:

1. connection.setAutoCommit(false); 
2. statement.executeUpdate(sql); 
3. connection.commit(); 

और अपने थ्रेड 2 इस निष्पादित हो रहा है एक ही समय में कोड:

1. connection.setAutoCommit(true); 

अब क्या हुआ अगर अनुदेश थ्रेड 2 में से 1 वास्तव में थ्रेड 1 के अनुदेश 3 से पहले निष्पादित किया जाता है? आपको शायद "स्वत: प्रतिबद्ध मोड में डेटाबेस" संदेश के साथ एक SQLException मिलेगा (क्योंकि ऑटो कनेक्शन विधियों को उसी कनेक्शन ऑब्जेक्ट पर निष्पादित किया जाता है)।

इसका मतलब यह है एक अपने कोड अयस्क उपयोग DSQLITE_THREADSAFE = 1

कनेक्शन पूलिंग का उपयोग करते हुए भी सबसे अच्छा होगा अगर आप वाला विकास multithread कोड है जहाँ से आप बेहतर प्रदर्शन जब आप किसी अन्य के लिए चुनते करने का फैसला प्राप्त कर सकते हैं कर रहे हैं सिंक्रनाइज़ चाहिए डीबीएमएस।