2010-10-14 8 views
5

Soy nuevo en el desarrollo de aplicaciones HTML5. En esto quiero insertar miles de registros en la base de datos sqlite usando HTML5. Este proceso es muy lento. Cómo usar BEGIN/COMMIT antes de insertar registros. De esta forma, para acelerar las inserciones. Por favor guíame a alguien. Gracias por adelantado. Ejecute este ejemplo en el navegador Chrome. Este es el código para su referencia:Cómo acelerar el proceso al insertar miles de registros en sqlite usando 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> 

Saludos, Neeraja.

+0

¿Qué tan lento? ¿Y qué navegador (s)? ¿Alguna muestra de código para mirar? Puede que no esté relacionado con SQLite, pero creo que es posible. – Frank

+1

¿Está realmente ejecutando una consulta para contar los registros en la tabla de registro como parte de cada inserción de registro? Eso te retrasaría bastante dramáticamente. –

+0

intente utilizar html5 webworkers. –

Respuesta

1

Estás iniciando 1000 transacciones. La comisión de una transacción es lenta porque está vinculada a la velocidad del disco duro. Ver this

+0

Quiero tus ideas. – Neeraja

+1

Pon todos tus 'INSERT's en la misma transacción. ¡Eso es todo! – Benoit

+0

No te entendí. Por favor, modifique el código anterior y envíelo. – Neeraja

0

Ya tiene el código para colocar sus 1000 inserciones dentro de una sola transacción. Por alguna razón, está comentada. ¡Elimina los comentarios y listo!

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

Este problema es que usted está utilizando una transacción independiente para cada paso, en lugar de volver a utilizarlo, de ahí que está funcionando mal.

db.transaction ES una transacción, por lo que no es necesario BEGIN/COMMIT.

Prueba esto:

<!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

No puedo hacer que esta solución funcione. Se trata sólo de mí ? Encontré otra solución en http://isgeek.eu/?p=59 –

0

Lo resuelto, puede ser que esto funciona. Use 'insert select union all' en lugar de crear 1000 instrucciones de inserción. Pero esto puede insertar solo 500 filas a la vez. Aquí está el código en el que trabajé, haga una prueba en Google Chrome, estoy seguro de que funciona.

<!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); 
}); 
} 

Mensaje de estado

0

he hecho escribió un pequeño módulo de JavaScript de código abierto llamado html5sql.js que resuelve este mismo problema. La buena noticia es que html5sql.js es realmente rápido. En el sitio web http://html5sql.com tengo una demostración que crea una tabla e inserta 11000 registros en esa tabla, generalmente en menos de un segundo o dos. Si alguien todavía está lidiando con este problema, recomiendo verificar html5sql.js.

+0

intenté con ese módulo lo que funciona excelente en el entorno de escritorio. Pero para integrarte en una aplicación de Android es una historia diferente. ¿Qué tal un soporte/demo/tutorial para eso? – wHiTeHaT

Cuestiones relacionadas