0

indexeddb データストアに挿入する必要があるサーバーからの 20 ~ 50k の JSON オブジェクト応答に苦労しています。

応答は foreach で繰り返され、すべての行がそれぞれに追加されます。応答が 10k 行未満の呼び出しは正常に機能し、1 分ほどで挿入されます。しかし、金額が大きくなると、しばらくするとデータベースが応答しなくなり、このエラー メッセージが返されます。

「db エラー エラー = 不明な理由でトランザクションが中止されました」

データベースには Dexie ラッパーを使用し、ngDexie と呼ばれる dexie には角度のあるラッパーを使用しています。

var deferred = $q.defer();
var progress = 0;
 // make the call
 $http({
       method: 'GET',
       headers: headers,
       url: '/Program.API/api/items/getitems/' + user
            }).success(function (response) {

        // parse response
        var items = angular.fromJson(response);
        // loop each item
        angular.forEach(items, function (item) {    
                    // insert into db
                    ngDexie.put('stuff', item).then(function () {
                        progress++;
                        $ionicLoading.show({
                            content: 'Loading',
                            animation: 'fade-in',
                            template: 'Inserting items to db: ' + progress
                                       + '/' + items.length,
                            showBackdrop: true,
                            maxWidth: 200,
                            showDelay: 0

                        });

                        if (progress == items.length) {
                            setTimeout(function () {
                                $ionicLoading.hide();
                            }, 500);
                            deferred.resolve(items);

                        }      
                    });
                });
            }).error(function (error) {
                $log('something went wrong');
                $ionicLoading.hide();
            });
            return deferred.promise;

データ全体を 1 つのチャンクで処理する方法が間違っていますか? より良い代替手段はありますか?この手順全体は、ユーザーがサイトを開いたときに 1 回だけ実行されます。すべてのヘルプは大歓迎です。対象端末は Android with Chrome 搭載のタブレットです。

4

3 に答える 3

1

不明なエラーが発生しているため、I/O に問題があります。私の推測では、下にあるデータベースには大量のデータの処理に問題があると思います。それぞれ最大 10k のバッチで分割しようとする場合があります。

特定の IDBRequest に関連しない理由で、トランザクションが失敗する場合があります。たとえば、トランザクションをコミットするときの IO エラーが原因で、または実装が特定の要求にクォータの超過を関連付けることができないクォータ制限に達したことが原因です。この場合、実装は、トランザクションをトランザクションとして使用し、適切なエラー タイプをエラーとして使用して、トランザクションを中止するための手順を実行する必要があります。たとえば、クォータを超えた場合は QuotaExceededError をエラーとして使用し、IO エラーが発生した場合は UnknownError をエラーとして使用する必要があります。

あなたは仕様でこれを見つけることができます

別の可能性として、オブジェクトストアにインデックスが定義されていますか? 持っているすべてのインデックスについて、そのインデックスはすべての挿入で維持される必要があるためです。

于 2015-11-08T14:33:43.000 に答える
0

多くの新しいレコードを挿入する場合は、add を使用することをお勧めします。これは、パフォーマンス上の理由から追加されました。こちらのドキュメントを参照してください。

https://github.com/FlussoBV/NgDexie/wiki/ngDexie.add

于 2016-09-14T07:21:35.130 に答える