3

我有大约 300 条记录需要插入到 websql 中。我开始编写 300 个不带参数的单独 tx.executeSql 插入语句。

tx.executeSql("INSERT INTO `beerlist` VALUES ('1', '21st Amendment', 'Back in Black IPA', '83', 'IPA', 'A');");

在 Chrome 上,这需要 2 毫秒。在 Android 上通过 phonegap 运行,这大约需要 43,438 毫秒。所以我切换到迭代一些 JSON 并使用 prepare 语句。像这样:

var beerList = {"beers":[{"beerid":"1","brewery":"21st Amendment","beername":"Back in Black IPA","bascore":"83","beertype":"IPA","beertable":"A"}}

$.each(beerList.beers, function(i, object) {
                    var insert = 'INSERT INTO beerlist VALUES (?, ?, ?, ?, ?, ?)';
                    tx.executeSql(insert, [object.beerid, object.brewery, object.beername, object.bascore, object.beertype, object.beertable], Beer.successInsert, Beer.failureInsert);
                });

我读到准备应该更快的地方,但我在 Chrome 上看到了相同的性能,实际上通过 Android 上的 Phonegap 的性能稍差,为 53,559 毫秒。我不敢相信插入 300 条记录需要大约 50 秒。有什么想法吗?

4

2 回答 2

4

您是否使用多个交易?可能不是您的插入速度很慢,而是事务。包含在单个事务中的多个执行要快得多

db.transaction( function(tx){
    for (var i = 0; i < args; i++)
    {
        tx.executeSql(sqlStmnt, args[i]); //args is nested [[1,2],[1,3]]
    }
},
dfd.reject,
dfd.resolve);
于 2013-04-08T14:35:57.633 回答
0

如您所见,executeSql 的成功处理程序是使用事务对象调用的。诀窍是重用该事务并发送并行请求。基本上,您使用单个事务,但控制执行多个但很少的异步请求。您应该能够将其存储在几毫秒内。

在您的示例中,它是不受控制的。您的所有 300 个请求在执行之前都已排队。这甚至可能使浏览器崩溃。

示例实现可以在https://bitbucket.org/ytkyaw/ydn-db/raw/master/js/ydn/db/core/req/websql.js中的 putObjects 方法中找到

于 2013-01-16T04:46:56.117 回答