Flask Python Gunicorn MySql-MySql连接不可用

Flask Python Gunicorn MySql-MySql连接不可用,python,mysql,nginx,flask,gunicorn,Python,Mysql,Nginx,Flask,Gunicorn,我读了很多关于这个错误的问题,但是没有一个能解决我的问题 我不太熟悉Python服务器端的东西,我在使用Gunicorn和Flask运行的api上遇到了这个错误 试图: -删除所有游标。关闭() -在返回之前的api调用之后添加cursor.close() 这是我的连接器: db = mysql.connector.connect( host="127.0.0.1", user="root", port=3306, password='password',

我读了很多关于这个错误的问题,但是没有一个能解决我的问题

我不太熟悉Python服务器端的东西,我在使用Gunicorn和Flask运行的api上遇到了这个错误

试图: -删除所有游标。关闭() -在返回之前的api调用之后添加cursor.close()

这是我的连接器:

db = mysql.connector.connect(
    host="127.0.0.1",
    user="root",
    port=3306,
    password='password',
    database='db'
)
api调用的一个示例:

@api.route('/update-entities', methods=['POST'])
def update_entities():
    try:
        validation = call_controller(ApiController(request.json).update_entities, 'update_entities')
        cursor = c.pearch_db.cursor()
        cursor.close()
        return jsonify({'status': validation.status, 'status_code': validation.status_code, 'message': validation.message}), validation.status_code
    except Exception:
        cursor = c.pearch_db.cursor()
        cursor.close()
        return jsonify(traceback.format_exc()), 500
错误:

Dec 13 11:47:43 cybertruck gunicorn[35123]:     return self.wsgi_app(environ, start_response)
Dec 13 11:47:43 cybertruck gunicorn[35123]:   File "/var/www/russell-python/Api/middleware.py", line 17, in __c
Dec 13 11:47:43 cybertruck gunicorn[35123]:     organization = Organization.find_one_by_client_id_and_client_se
Dec 13 11:47:43 cybertruck gunicorn[35123]:   File "/var/www/russell-python/Common/Model/organization.py", line
Dec 13 11:47:43 cybertruck gunicorn[35123]:     results = h.query(sql)
Dec 13 11:47:43 cybertruck gunicorn[35123]:   File "/var/www/russell-python/Common/helpers.py", line 19, in que
Dec 13 11:47:43 cybertruck gunicorn[35123]:     cursor = db.cursor(dictionary=dictionary)
Dec 13 11:47:43 cybertruck gunicorn[35123]:   File "/var/www/russell-python/pearch/local/lib/python3.6/site-pac
Dec 13 11:47:43 cybertruck gunicorn[35123]:     raise errors.OperationalError("MySQL Connection not available."
Dec 13 11:47:43 cybertruck gunicorn[35123]: mysql.connector.errors.OperationalError: MySQL Connection not avail
因此,此错误迫使我每次重新启动负责gunicorn的服务,否则api将无法工作。重新启动服务可在几分钟内解决该问题。该api当时可能有5个人使用

以下是ubuntu服务器中的服务配置(不幸的是,失败后重新启动无法解决此问题)

Mysql具有以下配置:

max_connections         = 1000
connect_timeout         = 5
wait_timeout            = 600
max_allowed_packet      = 16M
thread_cache_size       = 128
sort_buffer_size        = 4M
bulk_insert_buffer_size = 16M
tmp_table_size          = 32M
max_heap_table_size     = 32M
nginx站点是这样的:

server {
    server_name serverher;
    proxy_connect_timeout 75s;
    proxy_read_timeout 300s;

    location / {
        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        proxy_connect_timeout 75s;
        proxy_read_timeout 300s;
        include proxy_params;
        proxy_pass http://unix:/var/www/russell-python/app.sock;
    }

    access_log /var/log/nginx/russell-python-access.log;
    error_log /var/log/nginx/russell-python-error.log;
}

我相信mysql和nginx都很好,还有gunicorn,它有一个巨大的超时设置,我不知道还有什么可以检查。

对于任何看到这一点的人,我都有相同的问题,并将其追溯到另一个bug作为根本原因

我的32个连接池中的连接已经用完了,所以经过一些研究,我发现我不应该使用
cnx.close()
而是应该
reset\u session
然后再
add\u connection
,以允许32个连接在池中保持为32个,并且不会随着时间的推移而减少(影响批处理作业和API调用,每个请求调用超过32次)

“MySQL连接不可用”的原因是,如果连接
已连接()

为了修复这两个bug,我继续使用自己的close,如下所示:

    def close(self):
        try:
            cnx = self.con
            if self.con.reset_session:
                cnx.reset_session()
        except OperationalError as err:
            if err.msg != 'MySQL Connection not available.':
                # This close method only needs to close available connections
                raise err
        finally:
            self.con.add_connection(cnx)
            self.con = None
因此,如果你看到“MySQL连接不可用”,去看看你是否正在使用
reset\u session
,并处理那里的错误


希望这能有所帮助。我觉得这里遗漏了太多东西。不是说我认为你没有提出一个像样的问题,而是我认为你偏离了方向。
cursor=c.pearch_db.cursor();c.close()
是没有希望的;光标是数据库连接的一部分,错误是说您没有连接。他们使用的是SQLAlchemy吗?在我看来,您可以立即删除NginX内容。这与此无关。您几乎可以肯定也可以删除MySQL配置,但其中可能有一些不可靠的地方。您应该关注连接的方式n数据库是在Flask中处理的;它是如何打开的,会话是如何管理的等等。不,我没有使用SQLAlchemyOk,那么什么是
c.pearch_db
?我假设这不是您自己的代码,对吗?
    def close(self):
        try:
            cnx = self.con
            if self.con.reset_session:
                cnx.reset_session()
        except OperationalError as err:
            if err.msg != 'MySQL Connection not available.':
                # This close method only needs to close available connections
                raise err
        finally:
            self.con.add_connection(cnx)
            self.con = None