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!");
}

「クライアント」の配列が数 1000 を超えない場合は問題ありませんが、50000 までにハングし、タブがクラッシュします。ネイティブ実装では、50000 をアップサートするのに数秒しかかかりません (Chrome 上)。

つまり、Linq2indexedDB でレコードをバッチ挿入する別の方法がありますか、または Linq2indexedDB は単にバッチ挿入/更新で動作しませんか?

4

1 に答える 1

1

Linq2indexedDB ライブラリをお試しいただきありがとうございます。これはまだ進行中の作業であるため、このようなフィードバックは非常に高く評価されます。他のフィードバックがある場合は、お知らせください。できることを確認します。

あなたは正しいです 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 に答える