আমি একাধিক সংযোগ থেকে একসাথে একটি এসকিউএল ডাটাবেস পড়তে এবং লিখতে পারি?


89

আমার কাছে একটি এসকিউএল ডাটাবেস রয়েছে যা দুটি প্রক্রিয়া দ্বারা ব্যবহৃত হয়। আমি ভাবছি, এসকিউএলাইটের অতি সাম্প্রতিক সংস্করণ সহ, যখন একটি প্রক্রিয়া (সংযোগ) ডাটাবেসে লিখতে একটি লেনদেন শুরু করে, অন্য প্রক্রিয়াটি কি একই সাথে ডাটাবেস থেকে পড়তে সক্ষম হবে?


সংশ্লিষ্ট প্রশ্ন এখানে দেখতে .. stackoverflow.com/questions/12117016/...
AndroidGeek

উত্তর:


146

আমি বিভিন্ন উত্স থেকে তথ্য সংগ্রহ করেছি, বেশিরভাগই sqlite.org থেকে, এবং এগুলি একসাথে রেখেছি:

প্রথমত, ডিফল্টরূপে, একাধিক প্রক্রিয়াগুলিতে একই সময়ে একই এসকিউএল ডাটাবেস খোলা থাকতে পারে এবং কয়েকটি পাঠ্য অ্যাক্সেস সমান্তরালে সন্তুষ্ট হতে পারে।

লেখার ক্ষেত্রে, ডাটাবেসে একটি একক লেখাই অল্প সময়ের জন্য ডাটাবেসকে লক করে রাখে, এমনকি কিছু পড়তে না, এমনকি ডেটাবেস ফাইলটি অ্যাক্সেস করতে পারে।

সংস্করণ ৩.7.০ থেকে শুরু করে একটি নতুন "রাইট অ্যাথহেড লগিং" (ওয়াল) বিকল্প উপলব্ধ রয়েছে, যেখানে পড়া এবং লেখা একযোগে অগ্রসর হতে পারে।

ডিফল্টরূপে, ওয়াল সক্ষম হয় না। ওয়াল চালু করতে, এসকিউএল ডকুমেন্টেশন দেখুন।


তাই হাইপোথটিকালি যদি আপনার এমন কোনও সমস্যার সমাধান করতে হয় যেখানে আপনি স্থানীয় জনগণের পক্ষে অ্যাক্সেসযোগ্য না করে সমান্তরালভাবে একাধিক ফাইল লেখার দক্ষতা তৈরি করে স্থানীয়ভাবে ডেটা চেয়েছিলেন তবে আপনাকে এ জাতীয় লেখার জন্য একটি ডাটাবেস ফাইলের প্রয়োজন হবে যাতে একাধিক লেখাগুলি একই সাথে ঘটতে পারে। তাই কি? আমি জানি যে একাধিক ফাইল সাধারণত নকল হয় তবে আমি সার্ভার সাইড ডেটাবেস ব্যবহার না করে সেলারি টাস্ক থেকে একাধিক লেখার উপায় বের করার চেষ্টা করছি কারণ কেবল স্থানীয় গণনাগুলির জন্য আমার ডেটা প্রয়োজন
পাইরেটএপ

এখানে প্রগমা, লকিং_মোড = এক্সক্লুসিভ রয়েছে যা আপনি যদি এই কার্যকারিতাটি প্রতিরোধ করতে চান তবে একক প্রক্রিয়াতে ডাটাবেস লক করতে ব্যবহার করা যেতে পারে।
স্কোয়েটা

20

এসকিউএলাইট 3 স্পষ্টভাবে একাধিক সংযোগের অনুমতি দেয় :

(5) একই অ্যাপ্লিকেশন একাধিক অ্যাপ্লিকেশন বা একাধিক উদাহরণ একই সময়ে একটি একক ডাটাবেস ফাইল অ্যাক্সেস করতে পারেন?

একাধিক প্রক্রিয়া একই সময়ে একই ডাটাবেস খোলা থাকতে পারে। একাধিক প্রক্রিয়া একই সময়ে একটি নির্বাচন করতে পারে। তবে কেবলমাত্র একটি প্রক্রিয়া সময়ে যেকোন মুহুর্তে ডাটাবেসে পরিবর্তন আনতে পারে।

সংযোগ ভাগ করার জন্য, এসকিউএলটি 3 ভাগ করা ক্যাশে ব্যবহার করুন :

সংস্করণ ৩.৩.০ দিয়ে শুরু করে এসকিউএলাইটে একটি বিশেষ "শেয়ারড-ক্যাশে" মোড অন্তর্ভুক্ত রয়েছে ( ডিফল্টরূপে অক্ষম )

৩.০.০ সংস্করণে, ভাগ করা-ক্যাশে মোডটি সংশোধন করা হয়েছিল যাতে একই ক্যাশে কেবল একটি থ্রেডের পরিবর্তে পুরো প্রক্রিয়াতে ভাগ করা যায়।

5.0 ভাগ করা-ক্যাশে মোড সক্ষম করা

ভাগ করা-ক্যাশে মোড প্রতি-প্রক্রিয়া ভিত্তিতে সক্ষম হয়। সি ইন্টারফেসটি ব্যবহার করে, নিম্নলিখিত এপিআইটি বিশ্বব্যাপী ভাগ করা-ক্যাশে মোড সক্ষম বা অক্ষম করতে ব্যবহার করা যেতে পারে:

int sqlite3_enable_shared_cache (int);

প্রতিটি কল sqlite3_enable_shared_cache () sqlite3_open (), sqlite3_open16 (), বা sqlite3_open_v2 () ব্যবহার করে নির্মিত পরবর্তী ডাটাবেস সংযোগগুলিকে প্রভাবিত করে। ইতিমধ্যে বিদ্যমান ডাটাবেস সংযোগগুলি অকার্যকর। Sqlite3_enable_shared_cache () এ প্রতিটি কল একই প্রক্রিয়ার মধ্যে পূর্ববর্তী সমস্ত কলকে ওভাররাইড করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.