2015-12-03 3 views
0

Я использую индексированный db в браузере и другую базу данных на стороне сервера. У меня огромные данные на серверной БД.Вставка большого количества данных, создающих страницу idle

Когда я запрашиваю данные с сервера, индекс db получает блокировку при вставке целых данных. Из-за этого мой передний конец становится бездействующим, и я не могу выполнить никаких действий.

Что мне делать?

ответ

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) и вместо фиксированного размера отслеживать, сколько времени вы потратили, и выход тогда.

Смежные вопросы