要插入的数据只有两个 TEXT 列,其单个长度甚至不超过 256。
我最初使用的是executeSimpleSQL
因为我不需要得到任何结果。它适用于高达 20K 的同时插入平滑,即在 bakground 中没有观察到滞后或冻结。
然而,在插入过程中,我可以看到 10 万个可怕的冻结。
所以,我尝试了这两个,
- 插入 500 条记录的块 - 这效果不佳,因为即使对于 20K 条记录,它也显示出明显的冻结。我什至没有尝试10万。
所以,我决定去异步并使用 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]
我的主要目标是转储多达 10 万 + 的数据,然后在需要时执行读取。