我使用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 |
+------+------+-----------------+----------+---------+-------+-------+------------------+
5条答案
按热度按时间9vw9lbht1#
正如Dusty所说:
每一个使用Django ORM的线程都会创建一个新的数据库连接。Django不会自动管理由你自己的线程创建的连接。所以你应该管理它。
您可以在每个线程退出之前简单地执行此操作:
n3ipq98p2#
请参见this question
每个使用Django ORM的线程都会创建一个新的数据库连接。
1tu0hz3e3#
虽然这不是针对你的问题,而是标题,可能会帮助别人,在我的公司,我们得到了这个消息,不能弄清楚它是从哪里来的.回溯后,我们发现使用django内置的网站模型与调试模式导致了大量的连接保持开放.
最后,我们在打开时间超过20分钟的DB连接上设置了超时。
mfpqipee4#
我遇到了同样的问题,但这是因为所有的视图都使用了
@login_required
。有时这个装饰器是不必要的,它为每个查询创建新的连接。明智地使用它,你也可以在进入下一个任务之前使用
connection.close()
关闭连接。mrphzbgm5#
Django在调试模式下,会为它处理的每个请求创建一个新线程,消除持久连接的影响。
开发服务器会为它处理的每个请求创建一个新线程,从而消除持久连接的效果。