我在浏览器上使用索引数据库,在服务器端使用其他数据库。我在服务器数据库上有大量数据。
当我从服务器请求数据时,Index db在插入整个数据时会被锁定。因此,我的前端变得空闲,我无法执行任何操作。
我该怎么办?
答案 0 :(得分:1)
在交易过程中将收益控制权交还给浏览器。
例如,如果你有这个:
var records = [ ... ]; // say there 100k records
for (var i = 0; i < records.length; ++i)
store.put(records[i]);
......将提出100k请求;即使发起每个请求的开销很小(几微秒),它也会累积到一个无响应的页面。
另一个极端是一次插入一条记录,在每次请求后将控制权交还给浏览器:
var i = 0;
function doNextRecord() {
if (i < records.length) {
store.put(records[i]).onsuccess = doNextRecord;
++i;
}
}
doNextRecord();
这将使页面保持响应,但屈服于事件循环100k次意味着事务将花费很长时间。
相反,请考虑使用批次。
var i = 0, BATCH_SIZE = 1000;
function doNextBatch() {
var request;
for (var b = 0; i < records.length && b < BATCH_SIZE; ++i, ++b)
request = store.put(records[i]);
if (i < records.length)
request.onsuccess = doNextBatch;
}
doNextBatch();
更好的是,设置一个帧限制(例如4ms),而不是固定大小,记录你花了多少时间,然后屈服。