bonjour à tous
je voulais savoir si quelqu4un utilise sqlite avec python et comme ça marche?
avez vous des liens à communiquer?
peut-on l'utiliser en mobile 6?
et avec delphi 2006?
bonjour à tous
je voulais savoir si quelqu4un utilise sqlite avec python et comme ça marche?
avez vous des liens à communiquer?
peut-on l'utiliser en mobile 6?
et avec delphi 2006?
Ca fait un an ou deux que j'ai commencé à l'utiliser, pour une raison simple : pas d'autre choix (ouais, les boules au début, tu as tes habitudes sur mysql et... non faut réapprendre un autre truc ), c'était isolément et pour une toute petite application... Maintenant je n'utilise plus que ça ! bref, je me dis que c'est le moment de partager un peu tout ce que j'en pense.
J'ai donc fait des bench pour voir un peu ce que ça donne, en plus d'un feeling général, sqlite2 est très robuste mais c'est pas franchement un foudre de guerre question vitesse, enfin ça reste suffisant pour... 98% des applications. Par contre sqlite3 place la barre très très haut en terme de performances, au moins aussi robuste que son petit frère, aussi (ou plus) rapide que myisam (une sacré référence en terme de rapidité, pas comme le innodb...) en écriture, et carrément 2 à 3 fois plus rapide en lecture peu importe la taille de la base ! attention toutefois aux requêtes trop compliquées (jointures en folies) pour lesquelles les résultats peuvent être assez différents.
Au final SQLite3 convient efficacement pour quasiment toutes les applications (on laisse les 2% qui reste à oracle et ses potes) pour peu qu'on soit pas trop exigent sur l'interface d'administration de la base... (faut quand même avouer que c'est pas le pérou, bon perso j'utilise sqliteman sous ouinedoze et pour le web, j'ai fait ma propre appli...)
Il est souvent dit que le talon d'Achille de SQLite est la question des accès concurrents, c'est plus vraiment vrai (je manque de recul pour savoir exactement où une base tunée à mort va cracker mais c'est clairement très au delà de 100 accès concurrents en écriture/seconde sur une machine correcte). SQlite3 a amené de bonnes améliorations dans la gestion des accès concurrents. En fait la base est lockée une fraction de seconde pendant un commit, là est le principal problème.
Il y a deux moyens de contourner ce problème :
- stocker chaque table dans un fichier séparé, ainsi seules les tables en cours d'écriture sont lockées au lieu de locker toute la base.
- la mise en attente. Ca peut sembler évident, sauf que par défaut, si une requête SQLite est confrontée à un lock, elle retourne une erreur ! Ca parait dingue, et pourtant c'est vrai. Cela dit, le mécanisme de mise en attente est implémenté (il ne fonctionne vraiment bien que depuis les versions très récentes de sqlite, ça peut sembler incroyable que ce point crucial n'est pas été mieux traité, mais le projet sqlite a eu jusqu'à peu pour seule ambition de remplacer avantageusement les fichiers de configuration !!), il suffit de l'activer via la fonction sqlite3_busy_timeout.
Malgré tout, il manque encore un élément franchement essentiel pour faire face à un gros trafic : le cache. SQLite ne peut pas, par conception, conserver des résultats de requête d'un client pour les clients suivant. Dans l'avenir, on peut imaginer que ça change (au hasard grâce à un démon genre sqlite_cache chargé de faire passerelle entre les connexions), en attendant il faut faire sans.
Mais là aussi, il existe des moyens de palier à ce vide cruel via une solution de cache externe qui dépendra de l'environnement de développement.
Enfin, question performances pures, sqlite3 étant parfaitement journalisé (garantie super solide de l'intégrité de la base en cas de coupure brutale de courant), il est inutile de cumuler cette aptitude avec les fonctions de journalisation du système de fichier. En effet, les perf de sqlite sont assez dépendantes des perf du système de fichier, il vaut mieux que ce dernier soit très rapide => je préfère donc du ext2 à du ext3 pour stocker les bases. D'autre part, pour certaines opérations répétitives telles que des batch d'inserts par centaines de milliers, on pourra avantageusement désactiver ponctuellement totalement la journalisation, la synchronisation et travailler en ram (sans filet donc !) :
En conclusion, avec l'intégration dans php 5.3, sqlite est en passe de devenir une solution formidable même si pour l'heure elle nécessite encore quelques "bons réglages" ou "adaptations plus ou moins lourdes" pour vraiment la mettre en face d'un sgbd traditionnel. Autrement dit, non geek s'abstenir.PRAGMA journal_mode = off; PRAGMA synchronous = 0; PRAGMA temp_store = 2;
Pour info SQlite est la base de données la plus diffusée dans le monde (un certain nombre d'applications l'utilise en interne, dont Firefox, ceci explique cela )
Pour la petite histoire, concrètement j'utilise sqlite3 avec un php 5.3.1 recompilé auquel j'adjoins xcache pour lequel j'ai développé une petite classe de gestion de cache aux petits oignons, le tout avec lighty pour servir le peuple . Pour ceux que ça intéresse, php est recompilé car la prise en charge de sqlite3 dans php n'est pas encore tout à fait complète (pas d'accès à la fonction sqlite3_busy_timeout), voici la petite modif qui transcende la bêêête :
Pour ceux qui veulent jeter un oeil et trouver l'inspiration pour se bricoler un cache de requêtes, c'est par là que ça se passe :fichier : php-5.3.1/ext/sqlite3/sqlite3.c
fonction : PHP_METHOD(sqlite3, open)
insérer à la ligne 149 (juste avant db_obj->initialised = 1;) :
sqlite3_busy_timeout(db_obj->db, 30000); // Timeout de 30000 millisecondes, soit 30 secondes
et hop on recompile, exemple très basique:
$ rm configure
$ ./buildconf --force
$ CFLAGS="-O2 -march=native" ./configure --prefix=/usr --with-libxml-dir=/usr/lib --with-iconv-dir=/usr --with-pdo-mysql=/usr --with-mysql=/usr --without-pear --disable-ipv6 --with-zlib --enable-mbstring
$ make
$ sudo make install
http://xcache.lighttpd.net/wiki/XcacheApi
chapeau becoupama
C# et PHP sont par nature très différents. Tu as travaillé sur les accès concurrents, moi je les ai exclus mais en ttt de signal, la perf est vraiment importante, pas question de récupérer un message d'erreur et le bouton reload n'est pas entré dans les moeurs
tu devrais faire un tuto
salut,
un tuto ? dis moi ce qui te servirait et je vais voir si je peux faire un tuto potable
Partager