python pymysql.err.OperationalError: (1040, 'Too many connections')

pymysql.err.OperationalError: (1040, 'Too many connections')
连接mysql数据库的次数太大了

这篇文章解释得很清楚:mysql的最大连接数问题:pymysql.err.OperationalError: (1040, 'Too many connections')

出现问题的原因:为了防止插入数据时,数据库连接挂掉,所有用了以下代码:

class FalvPipeline(object):
    def __init__(self):
        self.client = pymysql.connect(host=host, user=username, password=password, port=port, db=db, charset=charset)
        self.cur = self.client.cursor()

    def my_process(self, item):
        # 先将item 入道文章表里面
        fetch_sql = """
                    select id from question_answer_pairs_findlaw_new where answer ='%s' and question ='%s'
                """ % (item.get('answer'), item.get('question'))

        self.cur.execute(fetch_sql)
        result = self.cur.fetchone()
        if not result:
            article_sql = """
                        insert into question_answer_pairs_findlaw_new (url, domain, question, answer, location, website) 
                        values ('%s', '%s', '%s', '%s', '%s', '%s')
                    """ % (pymysql.escape_string(item.get('url')), pymysql.escape_string(item.get('domain')),
                           pymysql.escape_string(item.get('question')), pymysql.escape_string(item.get('answer')),
                           pymysql.escape_string(item.get('location')), pymysql.escape_string(item.get('website')))

            self.cur.execute(article_sql)
            self.client.commit()

    def process_item(self, item, spider):
        try:
            self.my_process(item)
        except:
            self.client = pymysql.connect(host=host, user=username, password=password, port=port, db=db,
                                          charset=charset)
            self.cur = self.client.cursor()
            self.my_process(item)

为了防止掉连接,使用try...excpet...里又重新连接了mysql数据库。结果多次数据没插入,最终导致以上错误:连接数据库次数超过限定次数了。

然后等了大半天,再次运行程序就没有出现那个错误了,估计是mysql程序自动检查连接是否还在使用,把长时间未使用的给自动关掉了。

解决这个问题。应该先检查原始的连接是否还可用,或是否掉了,然后再确定要不要重新连mysql数据库。
mysql MySqlConnection判断mysql是否连接成功and查看连接数和状态等

import mysql.connector
# password设为mysql的root口令
conn = mysql.connector.connect(user='root', password='password', database='test')
cursor = conn.cursor()
# 创建user表
cursor.execute('要执行的sql语句')
# 提交事务
conn.commit()
# 关闭Cursor和Connection:
cursor.close()
conn.close()

try:
   # 执行sql语句
   cursor.execute(sql)
   # 执行sql语句
   conn .commit()
except:
   # 发生错误时回滚
   conn .rollback()

你可能感兴趣的:(python pymysql.err.OperationalError: (1040, 'Too many connections'))