Flask Python Gunicorn MySql-MySql连接不可用
我读了很多关于这个错误的问题,但是没有一个能解决我的问题 我不太熟悉Python服务器端的东西,我在使用Gunicorn和Flask运行的api上遇到了这个错误 试图: -删除所有游标。关闭() -在返回之前的api调用之后添加cursor.close() 这是我的连接器: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',
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