IndexedDB:何时关闭连接

mwecs4sa  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(4)|浏览(437)

我想知道关闭数据库连接的正确位置。
假设我有以下代码:

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最好()是. I正在关闭requestAdd.onsuccess内部的连接,但如果发生错误并触发requestAdd.onerror,连接可能仍然打开。我正在考虑在request.onerror下面添加trans.oncomplete,并关闭数据库连接,这可能是一个更好的选择。欢迎您的任何输入。谢谢。

monwx1rj

monwx1rj1#

如果要升级数据库架构,您可能希望显式关闭连接。
1.用户在一个选项卡(选项卡#1)中打开您的站点,并保持打开状态。
1.您将更新推送到站点,其中包括用于升级数据库架构的代码,从而增加版本号。
1.同一用户打开您站点的第二个选项卡(选项卡#2),并尝试连接到数据库。
如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止。标签#1将看到“versionchange”事件(因此它可以按需关闭);如果它不关闭其连接,则选项卡#2将看到“blocked”事件。
如果连接不是由标签#1保持打开,则标签#2将能够连接和升级。如果标签#1随后尝试(基于用户操作等)打开数据库(具有显式版本号),则它将失败,因为它将使用旧版本号(因为它仍然具有旧代码)。

mfuanj7w

mfuanj7w2#

你通常不需要关闭一个连接。你不会造成内存泄漏或类似的事情。保持连接打开不会导致实质性的性能下降。
我建议不要担心。
另外,在request.onerror之前还是之后添加trans.oncomplete并不重要。我理解这可能会造成混乱,但是绑定侦听器的顺序是无关紧要的(限定:来自同一函数范围内)。

wooyq4lh

wooyq4lh3#

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

yduiuuwa

yduiuuwa4#

可以在创建事务后立即调用db.close(

var trans = db.transaction(storeName, "readwrite");
db.close();

并且只有在事务完成后它才会关闭连接。https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/close表示The connection is not actually closed until all transactions created using this connection are complete. No new transactions can be created for this connection once this method is called.

相关问题