如何使用Linq indexedDB批量插入/更新

时间:2014-03-20 18:58:15

标签: batch-processing bulkinsert indexeddb localdb linq2indexeddb

我在使用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是否与批量插入/更新无关?

1 个答案:

答案 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.
});