SQLite Singelton in mehreren Threads: App stürzt ab

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • SQLite Singelton in mehreren Threads: App stürzt ab

    Hallo zusammen,

    da ich schon einmal Probleme mit der sqlite auf dem iPhone hatte, habe ich den Aufruf der sqlite in ein Singelton gepackt. Wenn die App jetzt aber in mehreren Threads auf das Singelton zugreift, dann stützt die App mit "EXC_BAD_ACCESS" ab.

    So baue ich das Singelton auf

    Quellcode

    1. + (GiveAndGetDB *)sharedInstance
    2. {
    3. static GiveAndGetDB *sharedCollection;
    4. @synchronized(self) {
    5. if (!sharedCollection) {
    6. sharedCollection = [[GiveAndGetDB alloc] init];
    7. }
    8. return sharedCollection;
    9. }
    10. }
    Alles anzeigen


    Aufruf im Code dann so:

    Quellcode

    1. GiveAndGetDB *giveAndGetDB = [GiveAndGetDB sharedInstance];


    Bekommt man sqlite mit mehreren Threads auf ein Singelton geregelt?

    Danke schon mal :)
  • Ich vermute mal, dass der eine auf die DB zugreift, den Handle kriegt und der nächste dann am bekommen des Handles scheitert, du könntest also ausprobieren noch ein Handle-Variable in den Singleton zu packen und die dann beim ersten Zugriff zu setzen, alle nachfolgenden nehmen die dann, die letzte Anfrage schließ die Connection dann natürlich wieder.


    p.s.: Achtung, gleich kommen bestimm die Singleton-Gegner :):)
  • Was soll denn der Quatsch mit dem Singleton ?

    Was gibt es für eine dümmere Idee als eine globale Variable zu nehmen um ein Multi-Threadding zu programmieren ???

    Es gibt ganz klare Regeln was die Multi-Thread Zugriffe auf sqlite betrifft.

    Du kannst beliebig viele Readonly Handle erzeugen aber nur einen Read/Write.

    Das macht ja auch Sinn.

    Wenn Du wirklich nicht absehen kannst wieviele Threads gerade auf die DB schreiben, dann machst Du halt eine OperationQueue die nacheinander die Schreibzugriffe abarbeitet.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)