SQLite - Best Practices?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • SQLite - Best Practices?

      Moinsen,

      eine App von mir, wo eine SQLite Datenbank im Mittelpunkt steht, ist über Jahre immer weiter gewachsen. Jetzt kommt der Zeitpunkt, wo ich mir über die Performance weitere Gedanken machen muss, einige DB-Funktionen wurden in verschiedene Threads ausgelagert.
      Ich gehen von folgende Vorraussetzungen aus:
      - Die App ist sandboxed
      - Es wird nur die SQLite C API benutzt
      - Die Datenbank ist sozusagen ein Dokument, welches der Nutzer frei wählen kann.
      - Ca. 95% der Zugriffe sind nur lesend
      - Verschiedene Threads benötigen Zugang
      - Liegt die Datei im App Container, kann der WAL Mode genutzt werden, außerhalb nur der Memory Mode.
      - Im Memory Mode können mehrere Threads lesend auf die DB zugreifen, oder es kann ein einzelner Scheibvorgang stattfinden.
      - Im WAL Mode können mehrere Threads lesend auf die DB zugreifen und es kann zusätzlich ein einzelner Schreibvorgang stattfinden.

      Um zu verhindern, dass mehrere Threads unerlaubter Weise zugreifen, teste ich z.Z. NSLock. Das funktioniert sicher, vergebe damit aber die Möglichkeit des parallelen Lesezugriffs.

      Jetzt meine Frage: Ist der Einsatz von NSLock hier sinnvoll?
    • Beim expliziten Sperren kann man schnell in Deadlocks laufen, insbesondere wenn du noch andere Sperren verwendest.

      Bei einer Dispatch-Queue kann dir das zwar auch passieren, es ist aber häufig leichter zu vermeiden, wenn Du
      • die Tasks in der Queue möglichst immer asynchron ausführst und
      • die Ergebnisse der Tasks außerhalb der Queue asynchron weiterverarbeitest.
      „Meine Komplikation hatte eine Komplikation.“