4

私はmysqlでDjangoを使用しており、接続が多すぎるというこの問題があります。

コマンドラインから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 プロセスリストのスクリーンショットを追加します。接続はすべてスリープ モードで何もせず、接続を作成するスレッドは既に終了しています。それは本当に奇妙です。

+------+------+-----------------+----------+---------+-------+-------+------------------+
| 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 組み込みサイト モデルをデバッグ モードで使用すると、多くの接続が開いたままになることがわかりました。

最終的に、20 分以上開いている DB 接続にタイムアウトを設定しました。

于 2017-03-31T14:41:07.607 に答える