我在使用Linq2indexedDB进行批量插入时遇到非常糟糕的性能和崩溃:
for(var i=0;i<clients.length;i++) {
db.from(config.objectStoreName).insert(clients[i]).then(function(args){
deferred.resolve(clients.length);
}, function(args){
deferred.reject("Client item couldn't be added!");
});
}
当做与本机indexedDB非常相似的事情时,它工作正常:
var store = db.transaction(["client"], "readwrite").objectStore("client");
for(var i=0;i<clients.length;i++) {
var request = store.put(clients[i]);
}
request.onsuccess = function() {
deferred.resolve(clients.length);
}
request.onerror = function(e) {
deferred.reject("Client item couldn't be added!");
}
当“客户”数组不超过1000时,没关系,但是50000它挂起然后选项卡崩溃了。在原生实现中,只需几秒钟即可将50000(在Chrome上)上架。
我是否遗漏了任何内容,即是否存在使用Linq2indexedDB批量插入记录的另一种方法,或者Linq2indexedDB是否与批量插入/更新无关?
答案 0 :(得分:1)
感谢您试用Linq2indexedDB库。这仍然是一项正在进行中的工作,因此这样的反馈非常适合。所以,如果您有其他反馈,请告诉我,我会看到我能为您做些什么。
你是对的,DbContext目前还没有提供批量插入。我将研究提供此功能。
我想我知道你为什么遇到性能问题。它现在的工作方式是为每个插件创建和关闭连接。这是我在lib中做出的选择。我希望每次连接时都能确保使用最新的数据库。我正在考虑更改此设置并使缓存连接成为可能,这将明确改善性能。
可能影响性能的其他因素: - 启用调试(将日志信息写入控制台) - 图书馆内的观众。对于每个插入,都会向此对象发送更新。
正如您现在提到的,您可以使用本机解决方案,或者您可以利用库中的包装器。
var dbpromise = linq2indexedDB.core.db("name", 1);
var transactionPromise = linq2indexedDB.core.transaction(dbpromise, ["objectstore"]);
var objectStorePromise = linq2indexedDB.core.objectStore(transactionPromise, "objectstore");
linq2indexedDB.core.insert(objectStorePromise, {}).then(success, error);
linq2indexedDB.core.insert(objectStorePromise, {}).then(success, error);
linq2indexedDB.core.insert(objectStorePromise, {}).then(success, error);
...
linq2indexedDB.core.insert(objectStorePromise, {}).then(success, error);
function success(args){
var data = args[0];
var primaryKey= args[1];
var transaction= args[2];
var orignalevent = args[3];
}
function error(args){
var error= args;
}
transactionPromise.then(function () {
// Transaction completed
// Bulk insert done.
});