我想知道关闭数据库连接的正确位置。
假设我有以下代码:
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,并关闭数据库连接,这可能是一个更好的选择。欢迎您的任何输入。谢谢。
4条答案
按热度按时间monwx1rj1#
如果要升级数据库架构,您可能希望显式关闭连接。
1.用户在一个选项卡(选项卡#1)中打开您的站点,并保持打开状态。
1.您将更新推送到站点,其中包括用于升级数据库架构的代码,从而增加版本号。
1.同一用户打开您站点的第二个选项卡(选项卡#2),并尝试连接到数据库。
如果连接由标签#1保持打开,则标签#2的连接/升级尝试将被阻止。标签#1将看到“versionchange”事件(因此它可以按需关闭);如果它不关闭其连接,则选项卡#2将看到“blocked”事件。
如果连接不是由标签#1保持打开,则标签#2将能够连接和升级。如果标签#1随后尝试(基于用户操作等)打开数据库(具有显式版本号),则它将失败,因为它将使用旧版本号(因为它仍然具有旧代码)。
mfuanj7w2#
你通常不需要关闭一个连接。你不会造成内存泄漏或类似的事情。保持连接打开不会导致实质性的性能下降。
我建议不要担心。
另外,在request.onerror之前还是之后添加trans.oncomplete并不重要。我理解这可能会造成混乱,但是绑定侦听器的顺序是无关紧要的(限定:来自同一函数范围内)。
wooyq4lh3#
如果您希望运行多个版本的应用程序,并且两个版本都访问同一个数据库,您可能会认为可以保持与两个版本的连接都打开。但这是不可能的。您必须先关闭一个版本的数据库,然后再打开另一个版本的数据库。但一个问题是,目前无法知道数据库实际关闭的时间。
yduiuuwa4#
可以在创建事务后立即调用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.