ฉันสามารถอ่านและเขียนไปยังฐานข้อมูล SQLite พร้อมกันจากการเชื่อมต่อหลายรายการได้หรือไม่


89

ฉันมีฐานข้อมูล SQLite ที่ใช้โดยสองกระบวนการ ฉันสงสัยว่าด้วย SQLite เวอร์ชันล่าสุดในขณะที่กระบวนการหนึ่ง (การเชื่อมต่อ) เริ่มต้นธุรกรรมเพื่อเขียนไปยังฐานข้อมูลกระบวนการอื่นจะสามารถอ่านจากฐานข้อมูลพร้อมกันได้หรือไม่


คำถามที่เกี่ยวข้องดูที่นี่ .. stackoverflow.com/questions/12117016/…
AndroidGeek

คำตอบ:


146

ฉันรวบรวมข้อมูลจากแหล่งต่างๆซึ่งส่วนใหญ่มาจาก sqlite.org และรวบรวมข้อมูลเหล่านี้เข้าด้วยกัน:

ขั้นแรกตามค่าเริ่มต้นกระบวนการต่างๆสามารถเปิดฐานข้อมูล SQLite เดียวกันได้ในเวลาเดียวกันและสามารถเข้าถึงการอ่านหลายรายการพร้อมกันได้

ในกรณีของการเขียนการเขียนไปยังฐานข้อมูลเพียงครั้งเดียวจะล็อกฐานข้อมูลในช่วงเวลาสั้น ๆ ไม่มีอะไรแม้แต่การอ่านก็สามารถเข้าถึงไฟล์ฐานข้อมูลได้เลย

เริ่มต้นด้วยเวอร์ชัน 3.7.0 จะมีตัวเลือก“ Write Ahead Logging” (WAL)ใหม่ซึ่งการอ่านและการเขียนสามารถดำเนินการไปพร้อมกันได้

โดยค่าเริ่มต้นจะไม่เปิดใช้งาน WAL ในการเปิดใช้งาน WAL โปรดดูเอกสาร SQLite


ดังนั้นถ้าคุณต้องแก้ปัญหาที่คุณต้องการข้อมูลในเครื่องโดยไม่ทำให้คนทั่วไปสามารถเข้าถึงได้ แต่ความสามารถในการเขียนหลายไฟล์พร้อมกันคุณจะต้องมีไฟล์ฐานข้อมูลหนึ่งไฟล์ต่อการเขียนดังกล่าวเพื่อให้การเขียนหลาย ๆ ครั้งอาจเกิดขึ้นพร้อมกัน ใช่ไหม? ฉันรู้ว่าไฟล์หลายไฟล์มักจะขมวดคิ้ว แต่ฉันพยายามหาวิธีเขียนหลาย ๆ รายการจากงานคื่นฉ่ายโดยไม่ต้องใช้ฐานข้อมูลฝั่งเซิร์ฟเวอร์เพราะฉันต้องการข้อมูลสำหรับการคำนวณในเครื่องเท่านั้น
PirateApp

มี pragma, locking_mode = เอกสิทธิ์ที่สามารถใช้เพื่อล็อกฐานข้อมูลเป็นกระบวนการเดียวหากคุณต้องการป้องกันฟังก์ชันนี้
Scovetta

20

SQLite3 อนุญาตการเชื่อมต่อหลายรายการอย่างชัดเจน:

(5) แอปพลิเคชันหลายตัวหรือหลายอินสแตนซ์ของแอปพลิเคชันเดียวกันสามารถเข้าถึงไฟล์ฐานข้อมูลเดียวพร้อมกันได้หรือไม่?

หลายกระบวนการสามารถเปิดฐานข้อมูลเดียวกันได้ในเวลาเดียวกัน หลายกระบวนการสามารถทำการเลือกได้ในเวลาเดียวกัน อย่างไรก็ตามมีเพียงกระบวนการเดียวเท่านั้นที่สามารถเปลี่ยนแปลงฐานข้อมูลได้ตลอดเวลา

สำหรับการแชร์การเชื่อมต่อให้ใช้SQLite3 shared cache :

เริ่มต้นด้วยเวอร์ชัน 3.3.0 SQLite จะมีโหมด "shared-cache" พิเศษ ( ปิดใช้งานโดยค่าเริ่มต้น )

ในเวอร์ชัน 3.5.0 โหมดแคชที่ใช้ร่วมกันได้รับการแก้ไขเพื่อให้สามารถแชร์แคชเดียวกันในกระบวนการทั้งหมดแทนที่จะเป็นเพียงเธรดเดียว

5.0 การเปิดใช้งานโหมดแคชที่ใช้ร่วมกัน

โหมดแคชที่ใช้ร่วมกันถูกเปิดใช้งานแบบต่อกระบวนการ เมื่อใช้อินเทอร์เฟซ C API ต่อไปนี้สามารถใช้เพื่อเปิดหรือปิดโหมดแคชที่ใช้ร่วมกันได้ทั่วโลก:

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.