要插入的数据只有两个TEXT列,其个别长度甚至不超过256个。
我最初使用executeSimpleSQL
,因为我不需要获得任何结果。
它可以平稳地插入高达20K的同时插入物,即在bakground中没有观察到滞后或冻结。
然而,在插入过程中,有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万以上,然后在需要时执行读取。