0

Observablesを使用してAngularJS 2IndexedDBを実装しています。 IndexedDBデータベースを開き、500レコードをフェッチするのに1秒もかかりませんでした。ただし、そのデータベース接続が開いている状態で、同じデータを再度フェッチすると約110秒かかりました。私は同じ結果を持つすべてのデータを取得するカーソルを含む様々なオプションを試してみました。この店には約4000レコードしかありません。同じリクエストを繰り返すとIndexedDBが遅くなります

私がしようとしていることを説明しようとするために、いくつかのサンプルコードが含まれています。エントリポイントとしてOfflineService.test()を実行します。

export class OfflineService { 
    constructor(private indexedDbService: IndexedDbService) { 
    } 

    test(): void { 
     this.indexedDbService.openDb() 
      .subscribe((open: boolean) => { 
       if (!open) { 
        // IndexedDB not supported 
        return; 
       } 
       this.indexedDbService.getObjectsById("items", 1, 500) 
        .subscribe((results: any[]) => { 
         // results returned in < 1 second 

         // retrieve again 
         this.indexedDbService.getObjectsById("items", 1, 500) 
          .subscribe((results: any[]) => { 
           // results returned in around 110 seconds 
          }); 
        }); 
      }); 
    } 
} 

export class IndexedDbService { 
    private db: any; 

    openDb(): Observable<boolean> { 
     return Observable.create((observer: any) => { 
      try { 
       if (this.db) { 
        observer.next(true); 
        observer.complete(); 
        return; 
       } 

       const request = indexedDB.open("testDb", 1); 
       request.onupgradeneeded = (event: any) => { 
        event.currentTarget.result.createObjectStore("items", { keyPath: "Id", autoIncrement: false }); 
       }; 
       request.onsuccess =() => { 
        this.db = request.result; 
        observer.next(true); 
        observer.complete(); 
       }; 
       request.onerror =() => { 
        observer.next(false); 
        observer.complete(); 
       }; 
      } catch (err) { 
       observer.next(false); 
       observer.complete(); 
      } 
     }); 
    } 

    getObjectsById(storeName: string, lowerId: number, upperId: number): Observable<any> { 
     return Observable.create((observer: any) => { 
      try { 
       const results: any[] = []; 
       const store = this.getObjectStore(storeName, false); 
       const request = store.openCursor(IDBKeyRange.bound(lowerId, upperId)); 
       request.onsuccess =() => { 
        var cursor = request.result; 
        if (cursor) { 
         results.push(cursor.value); 
         cursor.continue(); 
        } else { 
         observer.next(results); 
         observer.complete(); 
        } 
       }; 
       request.onerror = (event) => { 
        observer.error(Error(event.target.errorCode)); 
       }; 
      } catch (err) { 
       observer.error(err); 
      } 
     }); 
    } 

    private getObjectStore(storeName: string, writable: boolean): any { 
     const transaction = this.db.transaction(storeName, writable ? "readwrite" : "readonly"); 
     return transaction.objectStore(storeName); 
    } 
} 
+0

これは正常ではありません。しかし、あなたのコードが問題の最小限の自己完結型の例であれば、助けを得る可能性は高くなります。同様に、観察可能なものを取り除き、それがそれを修正するかどうかを確認してください。そうでない場合は、データベースを設定するコードを組み込み、実際にこの例を実行してください。 – dumbmatter

+0

@dumbmatter問題を引き起こしているObservablesかIndexedDBなのかどうか分からなかったので、上記のコードをすべて含めました。それはどちらでもなかったことが分かります。下の私の答えを見てください。私はあなたに同意しますが、実行可能な最小限のコードまたはより多くのコードが常にベストです。 –

答えて

0

私は最終的にIndexedDBまたはObservablesを行うには何もなかったことを考え出しました。最初の結果セットをロードした後、IndexedDBへの2回目の呼び出しは、より多くのメモリが使用されているため単純に遅くなりました。 2番目の呼び出しを行う前に元の結果をクリアして、パフォーマンスの問題を修正しました。

関連する問題