2010-02-09 97 views
1

我想插入超过70,000行到JavaScript数据库(使用Chrome 5.0.317.2)。插入物需要很长时间。实际的页面会在几秒钟内加载,而且我可以看到进度,因为插入每行的百分比增长非常缓慢。花了大约一个小时完成插入所有记录。有没有办法优化插入,或者以某种方式从预加载的SQLite数据库开始?Javascript数据库大量插入

<script src="jquery.1.3.2.min.js" type="text/javascript" charset="utf-8"></script> 
<script type="text/javascript" charset="utf-8"> 
// Truncated to 1 row for example. There are really 76547 rows. 
var zipcodes = var zipcodes = [{"city_name":"AMHERST","city_alias":"AMHERST","zipcode":"01002"}]; 
var db; 
function openMyDatabase() { 
    var shortName = 'mydb'; 
    var version = '1.0'; 
    var displayName = 'mydb'; 
    var maxSize = 65536; 
    db = openDatabase(shortName, version, displayName, maxSize); 
    db.transaction(
     function(transaction) { 
      transaction.executeSql(
       'CREATE TABLE IF NOT EXISTS zipcode ' + 
       ' (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' + 
       ' city_name TEXT NOT NULL, ' + 
       ' city_alias TEXT NOT NULL, ' + 
       ' zipcode TEXT NOT NULL)' 
      ); 
     } 
    ); 
    $.each(zipcodes, function(i, zipcode) { 
     insertZipcode(zipcode.city_name, zipcode.city_alias, zipcode.zipcode, i); 
    }); 
} 

function errorHandler(transaction, error) { 
    alert('Oops. Error was '+error.message+' (Code '+error.code+')'); 
    return true; 
} 

function insertZipcode(cityName, cityAlias, zipcode, i) { 
    db.transaction(
     function(transaction) { 
      transaction.executeSql(
       'INSERT INTO zipcode (city_name, city_alias, zipcode) VALUES (?, ?, ?);', 
       [cityName, cityAlias, zipcode], 
       function(){ 
        $('#counter').html((100 * i/zipcodes.length) + '%'); 
       }, 
       errorHandler 
      ); 
     } 
    ); 
    return false; 
} 

$(function() { 
    openMyDatabase(); 
}); 
</script> 

解决方案:在PHP侧,我提出的关联数组和所用的邮政编码作为键和城市作为值的阵列,并且我跑它通过json_encode和通过了给JavaScript。在JavaScript端我能够通过使用下面的代码很快得到城市特定邮政编码的列表:

var zipcodes = {"55437":["MINNEAPOLIS","BLOOMINGTON"]}; //truncated 
alert('Cities in 55437: ' + zipcodes['55437'].join(', ')); 

回答

1

为什么不使用预加载的XML而不是在网页加载时创建所有字段?这样你就可以减少加载时间,并且可以通过某种类型的索引来减少搜索时间,可能是哈希表索引或二进制搜索。

这会降低灵活性,这意味着您必须更改XML并在工具的帮助下进行编译 - 我不知道是否存在类似的东西;但会提供更好的性能,特别是如果您使用的是像iPhone这样的有限设备。

+0

我使用XML/XPath的尝试,但仍然过于缓慢,但是通过使用JSON,我是能够使一个巨大的物体,很容易和快速地搜索邮政编码。 – 2010-02-09 16:23:07

+0

有趣的是知道JSON比XML快。完全可以理解。 – jpabluz 2010-02-09 18:10:57

3

的一个问题,我可以看到的是,你正试图在插入一行时间,这可能会导致大量的连接等开销...

它会更快,如果你可以插入多行(一次可能20或50)。您可以使用某些有效的程序或INSERT INTO或其他东西插入多行。

0

在任何情况下,一个小时可能都太长,但即使您减少了很多,您仍然需要等待很长时间。它可能会支付产生一个新的线程处理这个过程独立于你的用户界面线程,以保持对用户的响应。

3

如果你不能将它移动到某个服务器端(Javascript实际上不是一个像这样的工作的工具),那么肯定会像Suraj所建议的那样将多个插入文件捆绑在一起。 90%的工作是开始连接,开始事务,结束事务,关闭连接。 10%是实际的数据库操作。

transaction.executeSql(' 
      INSERT INTO zipcode (city_name, city_alias, zipcode) VALUES (?, ?, ?); 
      INSERT INTO zipcode (city_name, city_alias, zipcode) VALUES (?, ?, ?); 
      INSERT INTO zipcode (city_name, city_alias, zipcode) VALUES (?, ?, ?); 
      ... //20-50 lines like this, maybe generated by a loop. 
      ',[ 
      cityName1, cityAlias1, zipcode1, 
      cityName2, cityAlias2, zipcode2, 
      cityName2, cityAlias3, zipcode3, 
      ... // a matching table, generated by a loop as well. 
      ], 
      ... 
1

我所做的克服这个问题是首先创建一个包含一个trasanction其所有执行字符串,然后使用JavaScript eval方法

jsonResponse = Ext.util.JSON.decode(result.responseText); 
     jsonIndex = 0; 
     var consulta = "DB.transaction(function (transaction){"; 
     while(jsonResponse[jsonIndex] != null){ 
      var ins = jsonResponse[jsonIndex].instruccion; 
      ins = ins.replace(/&quot;/gi, "\""); 
      consulta+= "transaction.executeSql('"+ins+"'); ";     
      jsonIndex++; 
     } 
     consulta+="});"; 
     eval(consulta);