SQLite et thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
cowpowah
Messages : 41
Inscription : mer. 02/juin/2010 12:41

SQLite et thread

Message par cowpowah »

Salut,

Si je lance une grosse opération d'écriture dans une base de données SQLite dans un thread, est-ce que je peux toujours accéder à cette base de donnée dans le programme principal (en dehors du thread donc)?

Et est-ce que l'option "Créer un exécutable multi threadé" est justifiée sachant que, pour le moment, c'est le seul thread que j'utilise?

Merci!
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: SQLite et thread

Message par boby »

est-ce que je peux toujours accéder à cette base de donnée dans le programme principal
Techniquement, oui.

Mais je te le déconseille TRÉS fortement ! Surtout sur du SQLite, c'est rarement une bonne idée d'avoir plusieurs accès en lecture / écriture sur un même fichier.

Une grosse opération d'écriture ? Qu'entend tu par la ? Par-ce que vraiment, je ne voie pas ce qui peut justifier l'utilisation d'un thread dédié pour écrire dans une base SQLite.

Je t'invite à jetter un oeuil ICI !
cowpowah
Messages : 41
Inscription : mer. 02/juin/2010 12:41

Re: SQLite et thread

Message par cowpowah »

Alors ça c'est génial!

Il faudrait que je me penche un peu plus sur SQLite parce que là j'ai une boucle affreuse qui marche tellement mal que je voulais la mettre dans un thread!

Code : Tout sélectionner

For i = 0 To unNombre
   If OpenDatabase(0, "DB.sqlite", "", "", #PB_Database_SQLite) 
      DatabaseQuery(0, "SELECT * FROM table1 WHERE colonne1=valeur1")
      If FirstDatabaseRow(0)   ; si l'enregistrement existe
         DatabaseUpdate(0, "UPDATE table1 SET colonne2 = valeur2 WHERE colonne1 = valeur1")   ; met à jour
         FinishDatabaseQuery(0)
      Else   ; si l'enregistrement n'existe pas
         DatabaseUpdate(0, "INSERT INTO table1 (colonne1, colonne2) VALUES (valeur1, valeur2)")   ; crée l'enregistrement
         ;Debug DatabaseError()
      EndIf
      FinishDatabaseQuery(0)
      CloseDatabase(0)
   EndIf
Next
Ça rame sur un vieux disque dur à plateaux... :mrgreen:

J'avais pas réussi à faire un UPDATE OR INSERT (UPSERT) avec la version de PB/SQLite que j'ai :(


WHOA! Je viens de tester ça:

Code : Tout sélectionner

OpenDatabase(0, "DB.sqlite", "", "", #PB_Database_SQLite)
DatabaseUpdate(0, "BEGIN TRANSACTION")

For i = 0 To unNombre
   DatabaseUpdate(0, "INSERT OR IGNORE INTO table1 (colonne1, colonne2) VALUES (valeur1, valeur2)")  ; crée enregistrement ou ignore si déjà existant
   DatabaseUpdate(0, "UPDATE table1 SET colonne2 = valeur2 WHERE colonne1 = valeur1")   ; MAJ enregistrement (si déjà existant)
Next

DatabaseUpdate(0, "COMMIT")
CloseDatabase(0)
La difference est juste énorme! Merci boby, plus besoin de thread! ;)
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: SQLite et thread

Message par Marc56 »

Si tu ne veux pas avoir à activer manuellement les transactions à chaque requête, tu peux envoyer des directives pragma une seule fois.
https://www.purebasic.fr/french/viewtop ... =6&t=16652

Notes: En mode écritures, SQLite verrouille la totalité de la base, les autres accès sont possibles en lecture.

Lire en entier les points 5 et 6 de la FAQ Sqlite

Bonne année 2019 :)
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: SQLite et thread

Message par boby »

Ça rame sur un vieux disque dur à plateaux
Oui par-ce que comme l'a dit Marc SQLite verouille les accès à la base, du coup sur une boucle de remplissage, il verouille et libère la base avant et après chaques requete, c'est pour ça que tu perd un temps considérable.
cowpowah
Messages : 41
Inscription : mer. 02/juin/2010 12:41

Re: SQLite et thread

Message par cowpowah »

Oui après on peut encore désactiver des sécurités (qu'on utilise jamais... :roll: ) pour gagner encore un peu plus, ou si le code permet pas de faire une transaction groupée.

Apparemment on peut même faire tourner un base de donnée en mémoire! 8O :twisted: Faut vraiment que je potasse la doc, y'a plein de trucs sympas en fait...

Enfin, mon programme tourne correctement pour le moment avec les transactions, c'est déjà top! :wink:
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: SQLite et thread

Message par boby »

Ouais alors faire tourner une bdd en RAM, si c'est une base de stockage temporaire pourquoi pas, mais si c'est des données à conserver, disons qu'un plantage et pouf pastèque ! C'est pas super sécur quoi...
cowpowah
Messages : 41
Inscription : mer. 02/juin/2010 12:41

Re: SQLite et thread

Message par cowpowah »

C'est clair! C'est même un peu le contraire du principe de la base de données, mais dans certains cas particuliers... Si on veut, on peut! :)
Répondre