IndexedDB:何时关闭连接

Nat*_*iaT 6 html5 indexeddb

我想知道关闭数据库连接的正确位置是什么.

假设我有以下代码:

function addItem(dbName, versionNumber, storeName, element, callback){

   var requestOpenDB = indexedDB.open(dbName, versionNumber); //IDBRequest
   requestOpenDB.onsuccess = function(event){

        //console.log ("requestOpenDB.onsuccess ");
        var db = event.target.result;

        var trans = db.transaction(storeName, "readwrite");
        var store = trans.objectStore(storeName);    
        var requestAdd = store.add(element);

        requestAdd.onsuccess = function(event) {

                    callback("Success");

        };
        requestAdd.onerror = function(event) {

                    callback("Error");       
        };      

    };
    requestOpenDB.onerror = function(event) { 

        console.log ("Error:" +  event.srcElement.error.message);/* handle error */ 
        callback("Error");
    };         
}
Run Code Online (Sandbox Code Playgroud)

addItem基本上将一个新元素添加到数据库中.根据我的理解,当触发requestAdd事件时,并不一定意味着事务已经完成.因此,我想知道调用db.close()的最佳位置是什么.我正在关闭requestAdd.onsucess内部的连接,但如果发生错误并且触发了requestAdd.onerror,则可能仍会打开连接.我正在考虑在request.onerror下添加trans.oncomplete并关闭这里的数据库连接,这可能是一个更好的选择.任何投入都将受到欢迎.谢谢.

Jos*_*osh 10

您通常不需要关闭连接。您不会造成内存泄漏或类似的情况。保持连接打开不会导致材料性能下降。

我建议不要担心它。

另外,无论在 request.onerror 之前还是之后添加 trans.oncomplete 并不重要。我理解它如何令人困惑,但是绑定侦听器的顺序是无关紧要的(限定:来自同一函数范围内)。


Jos*_*ell 7

如果您预计升级数据库架构,则可能希望显式关闭连接.这是场景:

  1. 用户在一个选项卡(选项卡#1)中打开您的站点,并将其保持打开状态.
  2. 您将更新推送到您的站点,其中包括升级数据库架构的代码,增加版本号.
  3. 同一个用户打开第二个选项卡到您的站点(选项卡#2),它尝试连接到数据库.

如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止.选项卡#1将看到"版本更改"事件(因此它可以按需关闭); 它没有关闭它的连接选项卡#2将看到"阻止"事件.

如果连接未被选项卡#1保持打开,则选项卡#2将能够连接和升级.如果选项卡#1然后尝试(基于用户操作等)打开数据库(具有显式版本号),它将失败,因为它将使用旧版本号(因为它仍然具有旧代码).

  • 规范回答了这个问题:https://w3c.github.io/IndexedDB/#dom-idbdatabase-close => https://w3c.github.io/IndexedDB/#dfn-steps-for-closing-a-database- connection - "等待使用连接创建的所有事务完成.一旦完成,连接就会关闭." - 因此,如果在成功处理程序中调用close(),则不会中止事务. (2认同)