私は、操作ごとに接続を開いてもパフォーマンスが大幅に低下しないことが分かりました。私は1年以上前からローカルのChrome拡張機能を実行してきましたが、これには大量のindexedDB操作が含まれており、何百回ものパフォーマンスを分析しており、接続をボトルネックとして開くことはありませんでした。ボトルネックは、索引を適切に使用しないか、大きなブロブを格納するようなことをします。
基本的に、この決定はパフォーマンスに基づいて行わないでください。接続という点では本当に問題ではありません。
実際にあなたのコードの人間工学、APIとの戦いの程度、コードを見てどのように直感的に感じるのか、コードがどれほど控えめであるのか、新鮮な目を歓迎するのか(1ヶ月後、または他の誰かのあなた自身のもの)。これは間接的にアプリケーションモダリティを扱っているブロッキングの問題に対処する際に非常に顕著です。
私の個人的な意見は、JavaScriptの非同期書き込みに慣れている場合は、あなたが好みの方法で使用することです。非同期コードで苦労している場合は、常に接続を開くことを選択することで問題が回避される傾向があります。私は、非同期コードの方が新しい人に、1つのグローバルページライフタイム変数を使用することを決して勧めません。また、ページの存続期間中に変数をそこに残しています。一方、非同期であることがわかり、グローバルdb変数をより受け入れやすいものにするには、是非それを使用してください。
編集 - あなたのコメントに基づいて、私は私が私の個人的な好みのいくつかの擬似コードを共有するだろうと思った:
function connect(name, version) {
return new Promise((resolve, reject) => {
const request = indexedDB.open(name, version);
request.onupgradeneeded = onupgradeneeded;
request.onsuccess =() => resolve(request.result);
request.onerror =() => reject(request.error);
request.onblocked =() => console.warn('pending till unblocked');
});
}
async foo(bar) {
let conn;
try {
conn = await connect(DBNAME, DBVERSION);
await storeBar(conn, bar);
} finally {
if(conn)
conn.close();
}
}
function storeBar(conn, bar) {
return new Promise((resolve, reject) => {
const tx = conn.transaction('store');
const store = tx.objectStore('store');
const request = store.put(bar);
request.onsuccess =() => resolve(request.result);
request.onerror =() => reject(request.error);
});
}
非同期で/のawait、自分の業務に余分なconn = await connect()
ラインを持つことにあまりにも多くの摩擦がありません機能。
乾杯、これはちょうど私が知る必要がある種類のものです。私は複数のタブをサポートしたいと思いますが、サービスワーカーも使用していますので、1つのタブが別のバージョンを取得するシナリオを取るべきではありません。より懸念されるのは、あるタブの接続が別のタブをブロックしていることです。これは、特に避けたいものです。 – Keith