Django mysql连接太多

acruukt9  于 2022-11-26  发布在  Go
关注(0)|答案(5)|浏览(275)

我使用Django和mysql,并且有太多连接的问题。
我从命令行运行python脚本,但是与Django模型集成来检查数据库中的数据。脚本每30秒运行一次,我使用线程来控制它。My_function是检查数据库状态的函数。

while True: 
    now = time.time() 
    if now < next: 
        time.sleep(next - now) 
        t = Thread(target=my_function,)
        t.start()# start a thread

    next += interval

问题是当我监控mysql服务器的时候。一直有大约10个连接,而且都在睡觉。我只是不明白为什么。有2个活跃的python线程一直在运行,而所有其他线程在它们结束的时候都被终止了。为什么mysql的连接会像10个一样?有人能帮助我吗?非常感谢!
更新1:现在放mysql processlist的截图,连接都在睡眠模式,什么都不做,创建连接的线程已经终止了,这真的很奇怪。

+------+------+-----------------+----------+---------+-------+-------+------------------+
| Id   | User | Host            | db       | Command | Time  | State | Info             |
+------+------+-----------------+----------+---------+-------+-------+------------------+
|  411 | root | localhost:47347 | NULL     | Sleep   |     2 |       | NULL             |
|  412 | root | localhost:47350 | NULL     | Sleep   |     3 |       | NULL             |
|  479 | root | localhost       | NULL     | Sleep   | 27164 |       | NULL             |
|  918 | root | localhost       | EZ_Green | Sleep   | 14006 |       | NULL             |
|  953 | root | localhost       | EZ_Green | Sleep   | 12956 |       | NULL             |
|  989 | root | localhost       | EZ_Green | Sleep   | 11874 |       | NULL             |
| 1025 | root | localhost       | EZ_Green | Sleep   | 10796 |       | NULL             |
| 1061 | root | localhost       | EZ_Green | Sleep   |  9716 |       | NULL             |
| 1097 | root | localhost       | EZ_Green | Sleep   |  8636 |       | NULL             |
| 1132 | root | localhost       | EZ_Green | Sleep   |  7586 |       | NULL             |
| 1168 | root | localhost       | EZ_Green | Sleep   |  6506 |       | NULL             |
| 1204 | root | localhost       | EZ_Green | Sleep   |  5426 |       | NULL             |
| 1240 | root | localhost       | EZ_Green | Sleep   |  4346 |       | NULL             |
| 1276 | root | localhost       | EZ_Green | Sleep   |  3266 |       | NULL             |
| 1312 | root | localhost       | EZ_Green | Sleep   |  2186 |       | NULL             |
| 1348 | root | localhost       | EZ_Green | Sleep   |  1106 |       | NULL             |
| 1384 | root | localhost       | EZ_Green | Sleep   |    26 |       | NULL             |
| 1385 | root | localhost       | NULL     | Query   |     0 | NULL  | show processlist |
+------+------+-----------------+----------+---------+-------+-------+------------------+
9vw9lbht

9vw9lbht1#

正如Dusty所说:
每一个使用Django ORM的线程都会创建一个新的数据库连接。Django不会自动管理由你自己的线程创建的连接。所以你应该管理它。
您可以在每个线程退出之前简单地执行此操作:

from django.db import connection

# your work thread method 

def my_function():
    # do something...
    # close the db connection explicitly

    connection.close()
n3ipq98p

n3ipq98p2#

请参见this question
每个使用Django ORM的线程都会创建一个新的数据库连接。

1tu0hz3e

1tu0hz3e3#

虽然这不是针对你的问题,而是标题,可能会帮助别人,在我的公司,我们得到了这个消息,不能弄清楚它是从哪里来的.回溯后,我们发现使用django内置的网站模型与调试模式导致了大量的连接保持开放.
最后,我们在打开时间超过20分钟的DB连接上设置了超时。

mfpqipee

mfpqipee4#

我遇到了同样的问题,但这是因为所有的视图都使用了@login_required
有时这个装饰器是不必要的,它为每个查询创建新的连接。明智地使用它,你也可以在进入下一个任务之前使用connection.close()关闭连接。

mrphzbgm

mrphzbgm5#

Django在调试模式下,会为它处理的每个请求创建一个新线程,消除持久连接的影响。
开发服务器会为它处理的每个请求创建一个新线程,从而消除持久连接的效果。

相关问题