2016-11-01 6 views
0

Я создаю REST API. Я использую Python, Flask и MySQL для извлечения данных из базы данных и представления их в формате JSON. Но у меня проблема.Python с флягой и MySQL время после периода бездействия

REST API обслуживается с NGINX и uWSGI, и все работает хорошо. Индексная страница остается доступной и не отключается, но страницы, которые делают подключение к базе данных. Потребовалось около 15 минут, чтобы страницы стали невосприимчивыми. Эта проблема не возникает в СУБД, например phpmyadmin или navicat.

Что это может быть и как я могу это исправить? Код API REST ниже.

# 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) 
+1

Мне кажется, что вы используете одно соединение по ходу нескольких запросов. Когда это соединение становится недействительным, новые запросы не могут быть выполнены, так как вы не создаете новое соединение. Я думаю, вы должны посмотреть на объединение пулов. Может быть, этот вопрос может помочь http://stackoverflow.com/questions/32658679/how-to-create-a-mysql-connection-pool-or-any-better-way-to-initialize-the-multip – Busturdust

+1

Не используйте одно глобальное соединение, вы столкнетесь с другими проблемами. Откройте и закройте соединение для каждого запроса или используйте пул для более эффективного управления этим. – davidism

+0

Я принял к сведению то, что вы, ребята, сказали. Я обновил код. Он все еще умирает через пару минут ... – Stephen

ответ

0

Все приведенные выше комментарии верны. Вот как вы можете изменить свой код, чтобы закрыть соединение с БД после каждого запроса. Он будет создавать новое соединение db каждый раз, когда вы вызываете 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

+0

Не могли бы вы взглянуть на мой измененный код выше. Я использую объединение, чтобы создать пару соединений. Я закрываю и открываю соединения во время выполнения. Как ни странно, это все еще не работает ... – Stephen

+0

Вы изменили свой код как мой ответ для 'get_db' и' connect_db', являющихся двумя функциями для создания соединения с mysql? –

 Смежные вопросы

  • Нет связанных вопросов^_^