2010-10-14 3 views
5

Je suis nouveau dans le développement d'applications HTML5. En cela, je veux insérer 1000 d'enregistrements dans la base de données sqlite en utilisant HTML5. Ce processus est très lent. Comment utiliser BEGIN/COMMIT avant d'insérer des enregistrements. De cette façon pour accélérer les insertions. S'il vous plaît, guidez moi n'importe qui. Merci d'avance. Veuillez exécuter cet exemple dans le navigateur Chrome. Ce est le code de référence:Comment accélérer le processus lors de l'insertion de 1000 enregistrements dans sqlite en utilisant HTML5

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
var msg; 
//db.transaction(function(tx){tx.executeSql("BEGIN",[]);}); 
for(var i=0;i<1000;i++) 
{ 
    txquer(i,"test"); 
} 
//db.transaction(function(tx){tx.executeSql("COMMIT",[]);}); 
db.transaction(function (tx) { 
    tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { 
    var len = results.rows.length, i; 
    msg = "<p>Found rows: " + len + "</p>"; 
    document.querySelector('#status').innerHTML += msg; 
}, null); 
}); 
function txquer(i,test) 
{ 
    db.transaction(
    function(tx){ 
     tx.executeSql('INSERT INTO LOGS (id, log) VALUES (?, ?)',[i,test]);  
    } 
    ); 
} 
</script> 
</head> 
<body> 
<div id="status" name="status">Status Message</div> 
</body> 
</html> 

Cordialement, Neeraja.

+0

Quelle est la lenteur? Et quel (s) navigateur (s)? Tout échantillon de code à regarder? Peut-être pas lié à SQLite, mais je crois que cela pourrait être possible. – Frank

+1

Exécutez-vous réellement une requête pour compter les enregistrements dans la table de journal dans le cadre de chaque insertion de journal? Cela vous ralentirait assez dramatiquement. –

+0

essayez d'utiliser les webworkers html5. –

Répondre

1

Vous commencez 1000 transactions. La validation d'une transaction est lente car elle est liée à la vitesse du disque dur. Voir this

+0

Je veux des idées de votre part. – Neeraja

+1

Mettez tous vos 'INSERT's dans la même transaction. C'est tout! – Benoit

+0

Je ne t'ai pas eu. Veuillez modifier le code ci-dessus et envoyez-le moi. – Neeraja

0

Vous avez déjà le code pour placer vos 1000 insertions dans une seule transaction. Pour une raison quelconque, il est commenté. Supprimer les commentaires et vous avez terminé!

db.transaction(function(tx){tx.executeSql("BEGIN",[]);}); 
for(var i=0;i<1000;i++) 
{ 
    txquer(i,"test"); 
} 
db.transaction(function(tx){tx.executeSql("COMMIT",[]);}); 
7

Ce problème est dû au fait que vous utilisez une transaction distincte pour chaque étape, au lieu de la réutiliser, d'où son fonctionnement médiocre. Db.transaction EST une transaction, donc BEGIN/COMMIT n'est pas nécessaire.

Essayez ceci:

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
var msg; 
db.transaction(function (tx) { 
    for(var i=0;i<1000;i++) 
    { 
     txquer(tx, i,"test"); 
    } 
}); 
db.transaction(function (tx) { 
    tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { 
    var len = results.rows.length, i; 
    msg = "<p>Found rows: " + len + "</p>"; 
    document.querySelector('#status').innerHTML += msg; 
}, null); 
}); 
function txquer(tx,i,test) 
{ 
    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (?, ?)',[i,test]);  
} 
</script> 
</head> 
<body> 
<div id="status" name="status">Status Message</div> 
</body> 
</html> 
+0

Je ne peux pas faire fonctionner cette solution. Est ce juste moi ? J'ai trouvé une autre solution sur http://isgeek.eu/?p=59 –

0

Je l'ai résolu, peut-être cela fonctionne. Utilisez 'insert select union all' au lieu de créer 1000 instructions insert.Mais ceci ne peut insérer que 500 lignes à la fois. Voici le code sur lequel j'ai travaillé, faire un test sur Google Chrome, je suis sûr que cela fonctionne.

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
var msg; 
var j=1; 
var i=1; 
var quer=""; 
db.transaction(function(tx){tx.executeSql("CREATE TABLE IF NOT EXISTS LOGS (ID INTEGER PRIMARY KEY ASC, todo TEXT)",[]);}); 
db.transaction(function(tx){tx.executeSql("delete from logs",[]);}); 
txquer(); 
showMsg(); 
function txquer() 
{ 
    quer="insert into logs "; 
for(i=j;i<=j+498;i++) 
{ 
    quer+=" select "+i+",'test' union all"; 
    } 
    quer+=" select "+i+",'test' ; "; 
    j=i+1; 
    db.transaction(
    function(tx){ 
     tx.executeSql(quer,[]);  
    } 
    ); 

} 

function showMsg(){ 
db.transaction(function (tx) { 
    tx.executeSql('SELECT count(*) todo FROM LOGS', [], function (tx, results) { 
    var len = results.rows.item(0).todo; 
    msg = "<p>Found rows: " + len + "</p>"; 
    document.querySelector('#status').innerHTML += msg; 
}, null); 
}); 
} 

Message d'état

0

J'ai effectivement écrit un petit open source javascript module appelé html5sql.js qui résout ce problème. Les bonnes nouvelles sont que html5sql.js est vraiment rapide. Sur le site Web http://html5sql.com J'ai une démo qui crée une table et insère 11000 enregistrements dans cette table, généralement en moins d'une seconde ou deux. Si quelqu'un est toujours confronté à ce problème, je vous recommande de vérifier html5sql.js.

+0

J'ai essayé ce module ce qui fonctionne le mieux dans l'environnement de bureau. Mais intégrer dans une application Android est une histoire différente.Comment un support/démo/tutoriel pour ça? – wHiTeHaT

Questions connexes