不断得到太多的连接'在Django 1.4.20

时间:2015-05-24 04:41:52

标签: mysql django

我目前在webfaction中有一个运行MySQL的应用程序。数据库是私人数据库,每12个小时左右,我会收到太多的连接数据。间歇性地出错。

所以我以root身份登录到mysql以检查活动连接的数量

mysql> show status like '%onn%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| Aborted_connects               | 4     |
| Com_enable_governor_reconn     | 0     |
| Com_enable_governor_reconn_lve | 0     |
| Connections                    | 12    |
| Max_used_connections           | 1     |
| Ssl_client_connects            | 0     |
| Ssl_connect_renegotiates       | 0     |
| Ssl_finished_connects          | 0     |
| Threads_connected              | 1     |
+--------------------------------+-------+

请注意,Max_used_connections = 1(??? !!!)很奇怪。好吧,也许流程有问题......

mysql> show processlist;
+----+------+-----------------+------+---------+------+-------+------------------+
| Id | User | Host            | db   | Command | Time | State | Info             |
+----+------+-----------------+------+---------+------+-------+------------------+
| 12 | root | localhost:38884 | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)

或者最大连接数被设置为无法解释的低数字......

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)

所以我放弃了。这似乎是A)我遇到了其中一个非常模糊的错误或B)我需要休假。

有人有想法吗?

感谢。

编辑:发现问题

问题是由使用cron运行的后台任务中的for object in Model.object.iterator()循环引起的。事实证明,屈服和连接被正确关闭存在问题。将其更改为.all()并且工作正常。

经验教训:1)避免将.iterator()用于后台任务; 2)尽可能避免将app数据库用于后台任务。

2 个答案:

答案 0 :(得分:1)

我通过在django app settings.py文件中增加MySQL允许的最大连接数来解决这个问题。更多信息 MySQL docs

DATABASES = { 
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': '',
    'USER': '',
    'PASSWORD': '',
    'HOST': 'localhost',
    'PORT': '3306',
    'OPTIONS': {
           "init_command": "SET GLOBAL max_connections = 100000", #<-- The fix
    }
  }
}

答案 1 :(得分:0)

您确定要连接到正确的数据库吗?

这部分看起来有点奇怪。

| Connections                    | 12    |

这意味着自启动以来,您只有12个与db的连接。 如果您的应用程序使用该数据库,则此数字应该更大。

如果mysql正常运行时间不是几秒,那么db的数字是错误的,某些应用程序正在使用。如果mysql正常运行时间仅为几秒,那么输出就没用了,你需要在db使用一段时间后提供输出。

尝试检查应用程序中的数据库连接设置。