【问题标题】:Python with flask and MySQL time out after period of inactivity在不活动一段时间后,带有烧瓶和 MySQL 的 Python 超时
【发布时间】:2016-11-01 14:44:40
【问题描述】:

我正在创建一个 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)

【问题讨论】:

  • 在我看来,您在多个请求的过程中使用了一个连接。当该连接失效时,由于您没有创建新连接,因此无法处理新请求。我认为您应该研究连接池。也许这个问题可以帮助stackoverflow.com/questions/32658679/…
  • 我注意到你们所说的。我已经更新了代码。几分钟后它仍然死机......

标签: python mysql flask uwsgi


【解决方案1】:

以上所有cmets都是正确的。这是您如何修改代码以在每次请求后关闭数据库连接的方法。每次调用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)

Link to docs

【讨论】:

  • 你能看看我上面修改过的代码吗?我正在使用池来创建几个连接。我在运行时关闭和打开连接。奇怪的是,这仍然不起作用......
  • 您是否修改了代码作为我对get_dbconnect_db 作为创建与mysql 连接的两个函数的答案?
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2016-03-20
  • 2010-09-25
  • 2023-03-06
  • 2011-05-07
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多