我目前正在处理一个项目,我使用 MariaDB 连接器来运行查询。
我不能使用 ORM,所以我必须使用原始查询。
一般来说,系统运行正常,正如预期的那样,但是当我进行一些“大”查询时,我得到了 Too many connections
错误信息。
对于 MySQL 和 MariaDB 连接器,这都发生在我身上,但我主要使用 MariaDB。
我的代码示例(截断/简化):
import mariadb
def get_cursor():
conn = mariadb.connect(
user="user",
password="pass",
host="localhost",
database="db")
return conn, conn.cursor(named_tuple=True)
def get_duplicated_variants():
results = []
conn_cursor = get_cursor()
cursor = conn_cursor[1]
conn = conn_cursor[0]
try:
cursor.execute("SELECT * FROM `db`.s_data;")
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
cursor.close()
conn.close()
return results
except mariadb.Error as e:
print(f"Error: {e}")
我试过的:show status like '%onn%';
还有:
show variables like 'max_connections';
所以
max_used_connections = 152
我有 2503 Connections
.我还尝试执行以下查询:
SELECT
CONCAT('KILL ', id, ';')
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE `User` = 'user'
AND `Host` = 'localhost'
AND `db` = 'db';
如 this question 中所见.但是运行查询后连接数是一样的,不行。
我怎样才能正确关闭连接?
我不明白为什么连接仍然有效,因为我同时使用了
cursor.close()
关闭光标和 conn.close()
关闭连接,但连接显然仍处于事件状态。我知道我可以增加
max_connections
类似:set global max_connections = 500;
但我想在查询完成后关闭来自后端的连接。任何的想法?
最佳答案
API 位于 here对于连接 close() 肯定很清楚连接已关闭。
我知道您说您截断了代码,但是在单个程序中看到您对 2,503 个连接的评论肯定会让您看起来没有共享该连接并且正在为每个查询创建新连接。我建议您检查未包含的代码,以确保您正确存储和重用该连接,而继续重新创建的成本将很高。
最后,我会用类似 netstat
的东西查看状态表。查看哪些连接真正进行以及它们来自/来自哪里。我并不完全清楚您是否排除了可能来自其他实体到/来自数据库的连接,或者连接实际上并没有被破坏。简而言之,我有点不确定您是否在这里追逐红鲱鱼。我仍然认为> 2000 个连接似乎是出乎意料的,您应该首先根据您提供的代码追查为什么会创建这么多连接。
关于python - 如何使用自定义连接器正确终止 Django 中的 MySQL/MariaDB 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68191265/