如果我不关闭一个 mysql 连接并打开另一个连接,会发生什么?

van*_*lay 2 python mysql

cnx = mysql.connector.connect(user="root", password="pass", host="127.0.0.1", database="db")
cursor = cnx.cursor()
return cursor, cnx
Run Code Online (Sandbox Code Playgroud)

假设我像上面那样打开一个连接,并进行选择查询cursor.execute(selectquery)并使用它cursor.fetchall()来获取数据。

如果我不这样做cnx.close(),cursor.close()当我不断打开并执行这样的选择查询时会发生什么?

连接会保持打开状态吗?或者是否有任何“垃圾巡逻队”可以看到它没有被使用?

ale*_*xis 5

假设您正在重用相同的变量名,或者它超出了范围(包含它的函数返回)而没有被明确关闭。最常见的 python 版本具有引用计数,它应该检测到不再有任何方法可以访问您的连接对象。所以最终应该关闭连接。但是 python 不保证这种行为,事实上(正如我暗示的)它并不适用于所有 python 引擎。

现在假设您使用两个不同的变量来保存两个同时打开的连接。这是完全合法的,偶尔有用。大多数情况下,您不会注意到任何奇怪的事情,但是如果启用了事务并且您放弃了第一个连接而不关闭它或提交事务,则在该事务中所做的数据库更改将不会从另一个连接可见。这就是交易的运作方式。

如果你不喜欢显式关闭的风格,你可以用一个with语句来保护连接:

with mysql.connector.connect(...) as cnx:
    cursor = cnx.cursor() 
    ...
Run Code Online (Sandbox Code Playgroud)

with无论通过什么路径,一旦执行离开块,连接就会为您关闭。