2015-12-08 58 views
0

我一直在摔跤這個問題幾天,但似乎無法找到任何解決方案。我正在嘗試使用Flask框架創建一個REST APIendpoint。問題在於,API在一段時間內給出了正確的結果,並且隨着時間的推移它會停止接收任何請求。我不知道爲什麼它突然發生。我最好的猜測是它的db連接池不會被清除。正如你可以在下面的代碼中看到的,我正確地關閉了數據庫連接,但仍面臨着這個問題。請幫忙!Flask 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" 
e = create_engine(conn_string) 

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() 

     conn = e.connect() 

     stat = """ 
     select a, b from report where c < ? and d > ? 
     """ 

     query = conn.execute(stat, [args['start'], args['end']]) 

     json_dict = [] 

     for i in query.cursor.fetchall(): 


      res = {'aa': i[0], 'bb':i[1]} 
      json_dict.append(res) 

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

api.add_resource(Report, '/report') 

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

出於好奇,你在某種服務器/共享主機或本地運行此操作嗎?如果前者在本地運行時是否工作? –

+0

是的,我正在服務器上運行它。不,即使在本地運行它也不起作用。該API只給我一天左右的結果,之後我必須一次又一次地重新啓動VM。 – 90abyss

回答

0

我建立一個基於你的代碼快速測試項目,連接到SQL Azure的數據庫,查詢簡單的一句話select * from (values (1), (2), (3), (4), (5)) numbers(number),本地運行。並通過node.js每秒要求這個API 10次。經過幾個小時的測試,它仍然運行良好。即使我使用NullPool禁用了池,它顯示在SQLalchemy guide上。

當您創建SQLalchemy連接引擎時,您可以嘗試放大pool sizeset Pool Recycle。如果這是一個數據庫連接池問題。

但是根據我的測試結果,您可以監視您的應用程序進行調試。 要調試在本地運行的flask應用程序,可以使用logging模塊,請參閱http://flask.pocoo.org/docs/0.10/errorhandling/以獲取更多信息。