如何使用HTML5将1000个记录插入sqlite时加快进程

时间:2010-10-14 06:46:54

标签: sqlite html5

我刚开发HTML5应用程序。在这里我想用HTML5将1000条记录插入sqlite数据库。这个过程非常缓慢。如何在插入记录之前使用BEGIN / COMMIT。以这种方式加快插入。请指导我任何人。提前致谢。请在Chrome浏览器中运行此示例。 这是供您参考的代码:

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

此致 Neeraja。

5 个答案:

答案 0 :(得分:7)

这个问题是你为每一步使用一个单独的事务,而不是重复使用它,因此它运行得很差。

db.transaction是一个事务,因此不需要BEGIN / COMMIT。

试试这个:

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

答案 1 :(得分:1)

您正在开始1000笔交易。提交事务很慢,因为它与硬盘驱动器速度相关联。见this

答案 2 :(得分:0)

您已经拥有将1000个插入内容放在单个事务中的代码。出于某种原因,它被注释掉了。删除评论,你就完成了!

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

答案 3 :(得分:0)

我解决了,可能这是有效的。使用'insert select union all'而不是创建1000个insert语句。但是这一次只能插入500行。这是我工作的代码,在谷歌浏览器上进行测试我确信它有效。

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

状态消息

答案 4 :(得分:0)

我实际上已经编写了一个名为html5sql.js的小型开源javascript模块,它解决了这个问题。好消息是html5sql.js非常快。在网站http://html5sql.com上,我有一个演示,它创建一个表并在该表中插入11000条记录,通常不到一两秒钟。如果有人还在处理这个问题我建议检查html5sql.js。