したがって、私はAmazon Web Services RDSを使用してMySQLサーバーを実行し、PythonのFlaskフレームワークを使用してアプリケーションサーバーを実行し、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')
Models.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
次に、dbの作成とアプリの起動後にテスト目的でデータベースにデータを入力するスクリプトを作成します。
from application import db
from application.models import Person
person = Person('Bob', 'Jones', '[email protected]')
db.session.add(person)
db.session.commit()
Db.drop_all()とdb.create_all()を使用してデータベースをリセットしたら、application.pyを起動してから、データベースにデータを入力するスクリプトを起動します。
サーバーは正しいJSONで応答しますが、戻って数時間後に確認すると、ロールバックする必要があるというエラーが表示されるか、MySQLサーバーがなくなったという2006年のエラーが表示されることがあります。
MySQLサーバーのタイムアウト設定を変更するよう提案されましたが、何も修正されていません。これが私の設定です:
innodb_lock_wait_timeout = 3000
max_allowed_packet = 65536
net_write_timeout = 300
wait_timeout = 300
次に、RDSモニターを見ると、MySQLサーバーがタイムアウトになるまで接続を開いたままにしていたことがわかります。私が間違っている場合は修正してくださいが、接続が終了した後に接続を閉じることになっているのではないですか?アプリケーションサーバーがデータベース接続が存在することを確認し続け、MySQLサーバーがタイムアウトになると、Flask/Flask-SQLAlchemyがエラーをスローし、アプリサーバーを停止するようです。
どんな提案もありがたいです、ありがとう!
何が追加されたと思います
db.init_app(application)
application.pyでは、それ以来エラーは発生していません。
ロールバックをチェックするかどうかは毎回面倒です。
コミットが必要な関数を挿入、更新しました。
@app.teardown_request
def session_clear(exception=None):
Session.remove()
if exception and Session.is_active:
Session.rollback()
ここでは、MySqlがしばらくしてセッションを閉じるため、プールのリサイクルが欠落しているため、プールのリサイクルを追加して、プールの接続がプールのリサイクル時間後に再接続されるようにする必要があります。
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600