SQLite et thread
SQLite et thread
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!
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!
Re: SQLite et thread
Techniquement, oui.est-ce que je peux toujours accéder à cette base de donnée dans le programme principal
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 !
Re: SQLite et thread
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!
Ça rame sur un vieux disque dur à plateaux...
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:
La difference est juste énorme! Merci boby, plus besoin de thread!
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
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)
Re: SQLite et thread
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
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
Re: SQLite et thread
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.Ça rame sur un vieux disque dur à plateaux
Re: SQLite et thread
Oui après on peut encore désactiver des sécurités (qu'on utilise jamais... ) 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! 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!
Apparemment on peut même faire tourner un base de donnée en mémoire! 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!
Re: SQLite et thread
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...
Re: SQLite et thread
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!