Поэтому я использую Amazon Web Services RDS для запуска сервера MySQL и использования фреймворка Python для запуска сервера приложений и Flask-SQLAlchemy для взаимодействия с RDS.
Мое приложение config.py
SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60
Мой __ init __. py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
application = Flask(__name__)
application.config.from_object('config')
db = SQLAlchemy(application)
У меня есть моя основная application.py
from flask import Flask
from application import db
import flask.ext.restless
from application.models import Person
application = Flask(__name__)
application.debug=True
db.init_app(application)
@application.route('/')
def index():
return "Hello, World!"
manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET','POST', 'DELETE'])
if __name__ == '__main__':
application.run(host='0.0.0.0')
Model.py
class Person(db.Model):
__bind_key__= 'people'
id = db.Column(db.Integer, primary_key=True)
firstName = db.Column(db.String(80))
lastName = db.Column(db.String(80))
email = db.Column(db.String(80))
def __init__(self, firstName=None, lastName=None, email=None):
self.firstName = firstName
self.lastName = lastName
self.email = email
Затем у меня есть script для заполнения базы данных для целей тестирования после создания db и запуска приложения:
from application import db
from application.models import Person
person = Person('Bob', 'Jones', '[email protected]')
db.session.add(person)
db.session.commit()
Как только у меня есть reset база данных с db.drop_all() и db.create_all(), я запустил application.py, а затем script, чтобы заполнить базу данных.
Сервер ответит правильным JSON, но если я вернусь и проверю его через несколько часов, я получаю сообщение об ошибке, которое мне нужно откат или иногда ошибка 2006 года, с которой сервер MySQL ушел.
Люди предложили изменить настройки тайм-аута на сервере MySQL, но это ничего не зафиксировало. Вот мои настройки:
innodb_lock_wait_timeout = 3000
max_allowed_packet = 65536
net_write_timeout = 300
wait_timeout = 300
Затем, когда я смотрю на монитор RDS, он показывает, что сервер MySQL поддерживал соединение открытым довольно долгое время до таймаута. Теперь исправьте меня, если я ошибаюсь, но не соединение, которое должно быть закрыто после его завершения? Кажется, что сервер приложений продолжает следить за тем, чтобы соединение с базой данных существовало, а затем, когда сервер MySQL истекает, Flask/Flask-SQLAlchemy выдает сообщение об ошибке и приносит с собой сервер приложений.
Любые предложения приветствуются, спасибо!