IndexedDB:何时关闭连接

时间:2016-01-21 04:46:12

标签: 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");
    };         
}

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

3 个答案:

答案 0 :(得分:7)

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

  1. 用户在一个标签页(标签#1)中打开您的网站,并将其保持打开状态。
  2. 您将更新推送到您的站点,其中包括升级数据库架构的代码,增加版本号。
  3. 同一个用户打开您网站的第二个标签(标签#2),它会尝试连接到数据库。
  4. 如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止。选项卡#1将看到"版本更改"事件(因此它可以按需关闭);它没有关闭它的连接标签#2会看到一个"被阻止"事件

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

答案 1 :(得分:2)

您通常永远不需要关闭连接。您没有创建内存泄漏或类似的东西。保持连接打开不会导致材料性能下降。

我建议不要担心。

此外,您是否在request.onerror之前或之后添加trans.oncomplete并不重要。我理解它是如何混淆的,但是你绑定监听器的顺序是无关紧要的(合格的:来自同一个函数范围内)。

答案 2 :(得分:0)

如果您想运行多个版本的应用并且都访问同一个数据库,您可能会认为可以保持对两者的连接。这是不可能的。您必须先关闭数据库,然后再打开另一个数据库。但有一个问题是,目前无法知道数据库何时实际关闭。