Оператор вставки API хранилища SQLite останавливает весь Firefox в начальной загрузке (Restartless) AddOn
Вставляемые данные имеют только два столбца TEXT, индивидуальная длина которых даже не превышает 256.
Я изначально использовал executeSimpleSQL
так как мне не нужно было получать никаких результатов. Это работало для одновременных вставок до 20К плавно, то есть на заднем плане не наблюдалось никаких задержек или замерзания.
Тем не менее, с 0,1 миллиона я мог видеть ужасное замерзание во время вставки.
Итак, я попробовал эти два,
- Вставить кусками по 500 записей - это не сработало, так как даже для записей 20К это показывало видимое замораживание. Я даже не пробовал с 0,1 млн.
Итак, я решил использовать async и использовал executeAsync вместе с Bind и т. Д. Это также показывает видимое зависание только для 20K записей. Это был весь вставляемый массив, а не кусками.
var dirs = Cc["@mozilla.org/file/directory_service;1"]. getService(Ci.nsIProperties); var dbFile = dirs.get("ProfD", Ci.nsIFile); var dbService = Cc["@mozilla.org/storage/service;1"]. getService(Ci.mozIStorageService); dbFile.append('mydatabase.sqlite'); var connectDB = dbService.openDatabase(dbFile); let insertStatement = connectDB.createStatement('INSERT INTO my_table (my_col_a,my_col_b) VALUES (:myColumnA,:myColumnB)'); var arraybind = insertStatement.newBindingParamsArray(); for (let i = 0; i < my_data_array.length; i++) { let params = arraybind.newBindingParams(); // Individual elements of array have csv my_data_arrayTC = my_data_array[i].split(','); params.bindByName("myColumnA", my_data_arrayTC[0]); params.bindByName("myColumnA", my_data_arrayTC[1]); arraybind.addParams(params); } insertStatement.bindParameters(arraybind); insertStatement.executeAsync({ handleResult: function(aResult) { console.log('Results are out'); }, handleError: function(aError) { console.log("Error: " + aError.message); }, handleCompletion: function(aReason) { if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) console.log("Query canceled or aborted!"); console.log('We are done inserting'); } }); connectDB.asyncClose(function() { console.log('[INFO][Write Database] Async - plus domain data'); });
Кроме того, я, кажется, получаю асинхронные обратные вызовы после долгого времени. Обычно, executeSimpleSQL
Это намного быстрее, чем это. Если я использую расширение SQLite Manager Tool, чтобы сразу открыть БД, это то, что я получаю (как и ожидалось)
SQLiteManager: Error in opening file mydatabase.sqlite - either the file is encrypted or corrupt
Exception Name: NS_ERROR_STORAGE_BUSY
Exception Message: Component returned failure code: 0x80630001 (NS_ERROR_STORAGE_BUSY) [mozIStorageService.openUnsharedDatabase]
Моей главной целью было сбросить данные размером более 0,1 миллиона, а затем выполнить чтение при необходимости.