2

以这种方式批量插入时,我遇到了非常糟糕的性能和 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!");
}

当“客户”的数组不超过几千个时,没关系,但是到了 50000 时,它就会挂起,然后选项卡就会崩溃。在本机实现上,只需几秒钟即可插入 50000(在 Chrome 上)。

我是否遗漏了什么,即是否有另一种方法可以使用 Linq2indexedDB 批量插入记录,或者 Linq2indexedDB 根本无法使用批量插入/更新?

4

1 回答 1

1

感谢您试用 Linq2indexedDB 库。这仍然是一项正在进行的工作,所以像这样的反馈是 mutch appriciated。因此,如果您有其他反馈,请告诉我,我会看看我能为您做些什么。

你是正确的 DbContext 现在不提供批量插入。我将考虑提供此功能。

我想我知道你为什么会有性能问题。它现在的工作方式是为您执行的每个插入创建和关闭连接。这是我在库中做出的选择。我想确保每次连接时都使用最新的数据库。我正在考虑更改此设置并使其可以缓存连接,这肯定会提高性能。

其他可能影响性能的事情: - 启用调试(将日志信息写入控制台) - 库内的查看器。对于每个插入,都会向该对象发送一个更新。

正如您现在提到的,您可以使用本机解决方案,或者您可以利用我在库中的包装器。

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.
});
于 2014-03-21T08:01:46.797 回答