【问题标题】:Flask RESTful API: Issue with db connection poolFlask RESTful API:数据库连接池问题
【发布时间】:2015-11-20 05:40:00
【问题描述】:

我正在尝试使用烧瓶框架创建 REST API 端点。这是我的完整工作脚本:

from flask import Flask, jsonify
from flask_restful import Resource, Api
from flask_restful import reqparse
from sqlalchemy import create_engine
from flask.ext.httpauth import HTTPBasicAuth
from flask.ext.cors import CORS

conn_string = "mssql+pyodbc://x:x@x:1433/x?driver=SQL Server"

auth = HTTPBasicAuth()

@auth.get_password
def get_password(username):
    if username == 'x':
        return 'x'
    return None

app = Flask(__name__)
cors = CORS(app)
api = Api(app)

class Report(Resource):
    decorators = [auth.login_required]

    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('start', type = str)
        parser.add_argument('end', type = str)
        args = parser.parse_args()
        e = create_engine(conn_string)
        conn = e.connect()

        stat = """
        select x from report 
        """

        query = conn.execute(stat)

        json_dict = []


        for i in query.cursor.fetchall():
                res = {'x': i[0], 'xx': i[1]}
                json_dict.append(res)


        conn.close()
        e.dispose()
        return jsonify(results=json_dict)


api.add_resource(Report, '/report')

if __name__ == '__main__':
    app.run(host='0.0.0.0')

问题是,当我只调用此 API 一天左右时,我会获得结果,之后我会停止获得结果,除非我重新启动我的脚本(有时甚至是我的 VM),然后我再次获得结果。我认为数据库连接池或其他问题存在一些问题,但我正在关闭连接并处理它。我不知道为什么 API 只给我一段时间的结果,因为我必须每天重新启动我的虚拟机。有什么想法吗?

【问题讨论】:

  • 也许考虑一下 Flask-SQLalchemy 扩展?有助于使这些事情变得更容易。

标签: python azure flask flask-sqlalchemy flask-restful


【解决方案1】:

根据我的经验,这个问题是由编码create_engine(conn_string) 在类Report 内创建数据库池引起的,以便始终为每个安静的请求执行数据库池的创建和销毁操作。使用 SQLAlchemy ORM 的方法不正确,会导致与 DB 连接相关的 IO 资源冲突,请参阅下面的 engine.dispose() 函数描述 http://docs.sqlalchemy.org/en/rel_1_0/core/connections.html#sqlalchemy.engine.Engine

要解决此问题,您只需将e = create_engine(conn_string) 移动到代码conn_string = "mssql+pyodbc://x:x@x:1433/x?driver=SQL Server" 的下方并删除Report 类中的代码e.dispose(),见下文。

conn_string = "mssql+pyodbc://x:x@x:1433/x?driver=SQL Server"
e = create_engine(conn_string) # To here

def get(delf)函数中:

args = parser.parse_args()
# Move: e = create_engine(conn_string)
conn = e.connect()

conn.close()
# Remove: e.dispose()
return jsonify(results=json_dict)

【讨论】:

  • 嗨!我仍然遇到同样的错误。还有其他想法吗?我完全按照你上面提到的那样做了。
  • @90abyss 问题发生时您会遇到任何错误吗?您可以参考故障排除文档azure.microsoft.com/en-us/documentation/articles/… 查找错误。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多