Python(1040,'太多连接')

时间:2014-05-10 03:41:08

标签: python mysql linux mysql-python

我在Python中的新手。 我有Item表,有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')

请告诉我它为什么会发生,我能否解决它。非常感谢:))

4 个答案:

答案 0 :(得分:3)

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

  

如果在尝试连接到mysqld服务器时出现太多连接错误,则表示其他客户端正在使用所有可用连接。

     

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

这意味着您已打开的数据库连接数超过服务器允许的数量,而不关闭它们。我从未在您的代码中看到closecon连接的来电。

答案 1 :(得分:3)

我通过在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 :(得分:0)

我的情况与OP并不完全相关,但首先是谷歌解决我的问题,所以......

我也在django中遇到too many connections错误。我在AWS上部署了两台服务器,一台EC2 t2.micro(Web服务器)和一台RDS t2.micro(mysql数据库)。 Web服务器运行debian,apache2(2.4.10-10 + deb8u3),python(2.7.9)和django(1.7.7-1 + deb8u3)的apt-get安装。我正在使用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左右。

答案 3 :(得分:0)

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

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