我想知道关闭数据库连接的正确位置是什么。
让我们说我有以下代码:
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并关闭这里的数据库连接,这可能是一个更好的选择。任何投入都将受到欢迎。谢谢。
答案 0 :(得分:7)
如果您预计升级数据库架构,则可能希望显式关闭连接。这是场景:
如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止。选项卡#1将看到"版本更改"事件(因此它可以按需关闭);它没有关闭它的连接标签#2会看到一个"被阻止"事件
如果标签#1的连接不,则标签#2将能够连接和升级。如果选项卡#1然后尝试(基于用户操作等)打开数据库(具有显式版本号),它将失败,因为它将使用旧版本号(因为它仍然具有旧代码)。
答案 1 :(得分:2)
您通常永远不需要关闭连接。您没有创建内存泄漏或类似的东西。保持连接打开不会导致材料性能下降。
我建议不要担心。
此外,您是否在request.onerror之前或之后添加trans.oncomplete并不重要。我理解它是如何混淆的,但是你绑定监听器的顺序是无关紧要的(合格的:来自同一个函数范围内)。
答案 2 :(得分:0)
如果您想运行多个版本的应用并且都访问同一个数据库,您可能会认为可以保持对两者的连接。这是不可能的。您必须先关闭数据库,然后再打开另一个数据库。但有一个问题是,目前无法知道数据库何时实际关闭。