【问题标题】:How to speed up the process when inserting 1000's of records into sqlite using HTML5使用 HTML5 将 1000 条记录插入 sqlite 时如何加快处理速度
【发布时间】:2010-10-14 06:46:54
【问题描述】:

我是开发 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>

问候, 尼拉哈。

【问题讨论】:

  • 有多慢?什么浏览器?有什么代码示例可以看吗?可能与 SQLite 无关,但我相信有可能。
  • 您是否真的在执行查询以将日志表中的记录计数为每个日志插入的一部分?这会大大减慢你的速度。

标签: sqlite html


【解决方案1】:

这个问题是您为每个步骤使用单独的事务,而不是重复使用它,因此它运行不佳。

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>

【讨论】:

  • 我无法使这个解决方案发挥作用。只有我吗 ?我在isgeek.eu/?p=59 上找到了另一个解决方案
【解决方案2】:

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

【讨论】:

  • 把你所有的INSERTs 放到同一个事务中。就是这样!
  • 我没听懂你。请修改以上代码发给我。
【解决方案3】:

您已经拥有将 1000 次插入放入单个事务中的代码。由于某种原因,它被注释掉了。移除 cmets 就完成了!

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

【讨论】:

    【解决方案4】:

    我解决了,可能这行得通。使用“insert select union all”而不是创建 1000 个插入语句。但这一次只能插入 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);
    });
    }
    

    状态消息

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我尝试了那个在桌面环境中表现出色的模块。但是作为一个 android 应用程序集成是另一回事。为此提供支持/演示/教程怎么样?
      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多