4

我将 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 |
+------+------+-----------------+----------+---------+-------+-------+------------------+
4

3 回答 3

6

正如尘埃所说,

每个使用 Django ORM 的线程都会创建一个新的数据库连接。并且 Django 不会自动管理由您自己的线程创建的连接。所以你应该管理它。

您可以在每个线程退出之前简单地执行此操作:

from django.db import connection

# your work thread method 

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

    connection.close()
于 2013-06-26T04:04:59.760 回答
3

请看这个问题

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

于 2013-01-29T22:15:23.370 回答
1

尽管这不是特定于您的问题,而是特定于标题,并且可能对其他人有所帮助,但在我的公司中,我们收到了此消息,但无法弄清楚它的来源。回溯后我们发现使用 django 内置的 Site 模型和调试模式会导致很多连接保持打开状态。

我们最终为打开超过 20 分钟的数据库连接设置了超时。

于 2017-03-31T14:41:07.607 回答