Python(1040,“连接太多”)

Posted

技术标签:

【中文标题】Python(1040,“连接太多”)【英文标题】:Python (1040, 'Too many connections') 【发布时间】:2014-06-27 21:59:18 【问题描述】:

我是 Python 的新手。 我有具有 3 个属性(名称、价格、图像)的项目表 我想从链接中获取 html 并保存到表中。所以我这样做了

from books.models import Book, Author, Publisher, Item
import urllib
import gzip
from StringIO import StringIO
from BeautifulSoup import BeautifulSoup
import mysqldb as mdb

def updateItems(request): 
    con = mdb.connect('localhost', 'anhnt', '12', 'db_django');
    cur = con.cursor()
    link = "http://pandagift.vn/i263/price1/qua-tang-doc-dao.htm"
    request = urllib.urlopen(link)
    output1 = open('web.txt', 'wb')
    html = ""
    html = request.read()
    output1.write(html)
    output1.close()
    beautifulSoup = BeautifulSoup(html)
    list_item = beautifulSoup.findAll("div", "class":"Item_ProcNews")
    if list_item:
    for item in list_item :
        #lay anh san pham
        image = item.findAll("img")[0]      
        st = str(image)
        beginindex = st.find('src') + 5
            endindex = st.find('jpg') + 3
        if(endindex == 2):
                endindex = st.find('png') + 3
            if(endindex == 2):
            endindex = st.find('jpeg') + 4
            if(endindex == 3):
                endindex = st.find('gif') + 3
            if(endindex == 2):
                        endindex = st.find('bmp') + 3
                if(endindex == 2):
                        endindex = st.find('JPG') + 3
        itemimage = str(image)[beginindex:endindex].encode('utf-8')
        #lay ten san pham
            name = item.findAll("span", "class":"item-name")[0]
        temp = name.findAll("a")[0]
        #itemname = temp.get('alt').encode('utf-8')
        itemname = temp.string.encode('utf-8')
            #lay gia san pham
            price = item.findAll("span", "class":"price")[0]
        #temp1 = str(price)
        #beginindex1 = temp1.find('price') + 7
            #endindex1 = temp1.find('/span') -1
        #itemprice = str(temp1)[beginindex1:endindex1]
        itemprice = str(price.string)
        #luu vao csdl
        query = "INSERT INTO books_item(name, price, image) VALUES('"+itemname+"', '"+itemprice+"', '"+itemimage+"')"
        cur.execute(query)
        #print query
    else:
        cur.execute("INSERT INTO books_item(name, price) VALUES('Hat', '10000vnd')")
    updateItems(request)

它的回报

  Exception Type:   OperationalError
  Exception Value:  (1040, 'Too many connections')

请告诉我为什么会发生,我可以修复它吗?非常感谢:)

【问题讨论】:

请发布您获得的完整错误回溯。另外,你为什么要从updateItems 打电话给updateItems?问题,我很确定你没有正确关闭数据库游标和连接。 谢谢。那是细节错误。 OperationalError at /updateItems/ (1040, 'Too many connections') 请求方法: GET 请求 URL: localhost:8000/updateItems Django 版本: 1.6.4 异常类型: OperationalError 异常值: (1040, 'Too many connections') 异常位置: / init 中的 usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py,第 193 行 Python 可执行文件:/usr/bin/python ---------- ------ 我调用 updateItems 是因为我希望 updateItems 被执行。 完成后关闭您的连接。您已经用完了文件描述符。就这么简单。 我从 www.djangobook.com/en/2.0/index.html 页面学习。在我的项目中 - 我在“模板”文档中的 showBooks.html 中有一个操作,调用 updateItems:
- 在 urls.py 文件中,我设置了它的路径 url (r'^updateItems/$', views.updateItems) - 在 /books/views.py 中,我有你看到的 def updateItems。啊,我这样改变了,但它仍然不起作用 else: cur.execute("INSERT INTO books_item(name, price) VALUES('Hat', '10000vnd')") con.close() updateItems(请求)
【参考方案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
    
  

【讨论】:

创可贴......一个有效的,但一个创可贴。真的,如果您使用的连接太多,您应该找出原因,而不是将其设置为某个超高的数字。【参考方案2】:

http://dev.mysql.com/doc/refman/5.0/en/too-many-connections.html

如果您在尝试连接到 mysqld 服务器时收到 Too many connections 错误,这意味着所有可用的连接都被其他客户端使用。

允许的连接数由 max_connections 系统变量控制。它的默认值为100。如果需要支持更多的连接,则应将此变量设置为较大的值。

这意味着您打开的数据库连接数超过了服务器允许的数量,但未关闭它们。我从未在您的代码中看到对close 连接con 的调用。

【讨论】:

【参考方案3】:

您需要:cur.close()con.close()

每个连接在使用后都应该关闭

【讨论】:

欢迎来到 SO。请查看tour。并且像这样强调你的代码cur.close()【参考方案4】:

我的情况与 OP 不完全相关,但我的问题在 google 上的第一个结果,所以...

我在 django 中也遇到了 too many connections 错误。我在 AWS 上部署了两台服务器,一台 EC2 t2.micro(Web 服务器)和一台 RDS t2.micro(mysql 数据库)。 Web 服务器正在运行 debian,apt-get 安装了 apache2 (2.4.10-10+deb8u3)、python (2.7.9) 和 django (1.7.7-1+deb8u3)。我仅将 django 用于 ORM,并且网站使用 mod_wsgi 托管在 apache 上。

mysql:

mysql> show variables like "max_connections";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 66    |
+-----------------+-------+
1 row in set (0.01 sec)

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.6.23                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| version                 | 5.6.23-log                   |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | Linux                        |
+-------------------------+------------------------------+
7 rows in set (0.02 sec)

我不得不调低/etc/apache2/sites-enabled/000-default.conf 中的一些设置来修复连接过多错误。这四个设置以前不在配置文件中(默认值):

ServerLimit 2
MaxRequestWorkers 10
ThreadsPerChild 5

WSGIDaemonProcess aaa threads=6

<VirtualHost *:80>
    ....

mysql 进程列表 (SELECT count(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE user='www-user') 现在保持在 21 左右。

【讨论】:

以上是关于Python(1040,“连接太多”)的主要内容,如果未能解决你的问题,请参考以下文章

python 垃圾回收机制

python-垃圾回收机制

Python 垃圾回收机制

python垃圾回收机制

python 垃圾回收机制

python 垃圾回收