我正在创建一个 REST API。我使用 Python、Flask 和 MySQL 从数据库获取数据并以 JSON 格式呈现它们。但我有一个问题。
REST API 由 NGINX 和 uWSGI 提供,一切运行良好。索引页保持可用并且不会超时,但与数据库建立连接的页面却会超时。页面大约需要 15 分钟才会变得无响应。在 phpmyadmin 或 navicat 等 RDBMS 中不会出现此问题。
这可能是什么以及如何修复它?下面的 REST API 代码。
# using python version 2.7.10
from flask import Flask, jsonify, request, session
import mysql.connector.pooling
#Make a connection with the DB
dbconfig = {
"host" : "12.34.5.78",
"database": "db",
"user": "user",
"password": "pass"
}
conn = mysql.connector.connect(pool_name = "mypool",
pool_size = 6,
**dbconfig)
#Define the root
app = Flask(__name__)
#Landings page
@app.route('/')
def index():
return "Hello World."
# return all resources by name
@app.route('/resources', methods=['GET'])
def allResourceNames():
conn1 = mysql.connector.connect(pool_name="mypool")
reader = conn1.cursor()
query = ("SELECT name FROM resources")
reader.execute(query)
resources = []
for name in reader:
resources.append({'name' : name[0]})
reader.close()
conn1.close()
return jsonify({"resources" : resources})
if __name__ == "__main__":
app.run(debug=True)
最佳答案
以上所有评论都是正确的。以下是如何修改代码以在每次请求后关闭数据库连接。每次调用 get_db
时,它都会创建一个新的数据库连接,并在每次请求后关闭它。
# using python version 2.7.10
import mysql
from flask import Flask, jsonify, request, session, g
def connect_db():
conn = mysql.connector.connect(user='user', password='pass',
host='12.34.5.67', database='db')
return conn
def get_db():
if not hasattr(g, 'db'):
g.db = connect_db()
return g.db
#Define the root
app = Flask(__name__)
# close db at end of each request
@app.teardown_appcontext
def close_db(_):
if hasattr(g, 'db'):
g.db.close()
#Landings page
@app.route('/')
def index():
return "Hello World."
# return all resources by name
@app.route('/resources', methods=['GET'])
def allResourceNames():
reader = get_db()
query = ("SELECT name FROM resources")
reader.execute(query)
resources = []
for name in reader:
resources.append({'name' : name[0]})
return jsonify({"resources" : resources})
if __name__ == "__main__":
app.run(debug=True)
关于使用 Flask 和 MySQL 的 Python 在不活动一段时间后超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362439/