我有大约300条记录需要插入到websql中。我首先编写了300个不带参数的独立tx.executeSql insert语句。
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毫秒。我不敢相信要花50秒才能插入300条记录。有什么想法吗?
发布于 2013-04-08 22:35:58
您是否在使用多个事务?可能不是你的插入慢,而是事务慢。在单个事务中包装多个执行的速度要快得多。
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-01-16 12:46:56
如您所见,executeSql的success handler是通过事务对象调用的。诀窍是重用事务并发送并行请求。基本上,您使用单个事务,但受控执行多个但很少的异步请求。你应该能够在几毫秒内存储它。
在您的示例中,它是不受控制的。您的所有300个请求在执行之前都会排队。这甚至可能会使浏览器崩溃。
可以在https://bitbucket.org/ytkyaw/ydn-db/raw/master/js/ydn/db/core/req/websql.js中的putObjects方法中找到一个示例实现
https://stackoverflow.com/questions/14343685
复制相似问题