我将Django与mysql一起使用,并且存在连接过多的问题。
我从命令行运行python脚本,但与Django模型集成以检查数据库中的数据。该脚本每30秒运行一次,我使用线程来控制它。 My_function是检查db状态的函数。
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进程列表的截图。连接都处于睡眠模式并且什么都不做,并且创建连接的线程已经终止。那真的很奇怪。
+------+------+-----------------+----------+---------+-------+-------+------------------+
| 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 |
+------+------+-----------------+----------+---------+-------+-------+------------------+
答案 0 :(得分:4)
尘土飞扬地说,
每个使用Django ORM的线程都会创建一个新的数据库连接。 并且Django不会自动管理由您自己的线程创建的连接。 所以你应该管理它。
您可以在每个线程退出之前执行此操作:
from django.db import connection
# your work thread method
def my_function():
# do something...
# close the db connection explicitly
connection.close()
答案 1 :(得分:2)
每个使用Django ORM的线程都会创建一个新的数据库连接。
答案 2 :(得分:1)
虽然这不是特定于你的问题,而是标题,可能会帮助其他人,在我的公司,我们得到了这个消息,无法弄清楚它的起源。 回溯后我们发现使用带调试模式的django内置Site模型会导致很多连接保持打开状态。
我们最终设置超过20分钟的数据库连接超时。