我想知道关闭数据库连接的正确位置是什么.
假设我有以下代码:
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 并不重要。我理解它如何令人困惑,但是绑定侦听器的顺序是无关紧要的(限定:来自同一函数范围内)。
如果您预计升级数据库架构,则可能希望显式关闭连接.这是场景:
如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止.选项卡#1将看到"版本更改"事件(因此它可以按需关闭); 它没有关闭它的连接选项卡#2将看到"阻止"事件.
如果连接未被选项卡#1保持打开,则选项卡#2将能够连接和升级.如果选项卡#1然后尝试(基于用户操作等)打开数据库(具有显式版本号),它将失败,因为它将使用旧版本号(因为它仍然具有旧代码).