Оператор вставки API хранилища SQLite останавливает весь Firefox в начальной загрузке (Restartless) AddOn

Вставляемые данные имеют только два столбца TEXT, индивидуальная длина которых даже не превышает 256.

Я изначально использовал executeSimpleSQL так как мне не нужно было получать никаких результатов. Это работало для одновременных вставок до 20К плавно, то есть на заднем плане не наблюдалось никаких задержек или замерзания.

Тем не менее, с 0,1 миллиона я мог видеть ужасное замерзание во время вставки.

Итак, я попробовал эти два,

  1. Вставить кусками по 500 записей - это не сработало, так как даже для записей 20К это показывало видимое замораживание. Я даже не пробовал с 0,1 млн.
  2. Итак, я решил использовать 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 миллиона, а затем выполнить чтение при необходимости.

0 ответов

Другие вопросы по тегам