IndexedDB 和 Angular 应用程序上的大量插入
IndexedDB and large amount of inserts on Angular app
我正在努力处理来自服务器的 20-50k JSON 对象响应,我应该将其插入到我们的 indexeddb 数据存储中。
使用 foreach 重复响应,并添加每一行。响应少于 10k 行的调用工作正常并在一分钟左右内插入。但是当金额变大时,数据库会在一段时间后停止响应并且 returns 此错误消息
"db Error err=transaction aborted for unknown reason"
我正在为数据库使用一个 Dexie 包装器,为 dexie 使用一个名为 ngDexie 的 angular 包装器。
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;
我在处理一个块中的整个数据时采用了错误的方法吗?有没有更好的选择?整个过程仅在用户打开网站时执行一次。非常感谢所有帮助。目标设备是 运行 Android 和 Chrome.
的平板电脑
由于您收到未知错误,I/O 出现了问题。我的猜测是下面的数据库在处理大量数据时遇到了麻烦。可以尝试分批拆分,每批最多10k。
A transaction can fail for reasons not tied to a particular IDBRequest. For example due to IO errors when committing the transaction, or due to running into a quota limit where the implementation can't tie exceeding the quota to a partcular request. In this case the implementation MUST run the steps for aborting a transaction using the transaction as transaction and the appropriate error type as error. For example if quota was exceeded then QuotaExceededError should be used as error, and if an IO error happened, UnknownError should be used as error.
您可以在 specs
中找到它
另一种可能性,您是否在对象存储上定义了任何索引?因为对于您拥有的每个索引,每次插入都需要维护该索引。
如果您插入许多新记录,我建议您使用添加。这是出于性能原因添加的。请参阅此处的文档:
我在处理大量批量插入(100.000 - 200.000 条记录)时遇到了问题。我已经使用 Dexie 库中的 bulkPut() 解决了我所有的 IndexedDB 性能问题。它具有以下重要功能:
Dexie has a kick-ass performance. It's bulk methods take advantage of
a not well known feature in indexedDB that makes it possible to store
stuff without listening to every onsuccess event. This speeds up the
performance to a maximum.
德克西:https://github.com/dfahlander/Dexie.js
BulkPut() -> http://dexie.org/docs/Table/Table.bulkPut()
我正在努力处理来自服务器的 20-50k JSON 对象响应,我应该将其插入到我们的 indexeddb 数据存储中。
使用 foreach 重复响应,并添加每一行。响应少于 10k 行的调用工作正常并在一分钟左右内插入。但是当金额变大时,数据库会在一段时间后停止响应并且 returns 此错误消息
"db Error err=transaction aborted for unknown reason"
我正在为数据库使用一个 Dexie 包装器,为 dexie 使用一个名为 ngDexie 的 angular 包装器。
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;
我在处理一个块中的整个数据时采用了错误的方法吗?有没有更好的选择?整个过程仅在用户打开网站时执行一次。非常感谢所有帮助。目标设备是 运行 Android 和 Chrome.
的平板电脑由于您收到未知错误,I/O 出现了问题。我的猜测是下面的数据库在处理大量数据时遇到了麻烦。可以尝试分批拆分,每批最多10k。
A transaction can fail for reasons not tied to a particular IDBRequest. For example due to IO errors when committing the transaction, or due to running into a quota limit where the implementation can't tie exceeding the quota to a partcular request. In this case the implementation MUST run the steps for aborting a transaction using the transaction as transaction and the appropriate error type as error. For example if quota was exceeded then QuotaExceededError should be used as error, and if an IO error happened, UnknownError should be used as error.
您可以在 specs
中找到它另一种可能性,您是否在对象存储上定义了任何索引?因为对于您拥有的每个索引,每次插入都需要维护该索引。
如果您插入许多新记录,我建议您使用添加。这是出于性能原因添加的。请参阅此处的文档:
我在处理大量批量插入(100.000 - 200.000 条记录)时遇到了问题。我已经使用 Dexie 库中的 bulkPut() 解决了我所有的 IndexedDB 性能问题。它具有以下重要功能:
Dexie has a kick-ass performance. It's bulk methods take advantage of a not well known feature in indexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum.
德克西:https://github.com/dfahlander/Dexie.js
BulkPut() -> http://dexie.org/docs/Table/Table.bulkPut()