web-dev-qa-db-ja.com

Flask-SQLAlchemy:無効なトランザクションがロールバックされるまで再接続できません

したがって、私は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がエラーをスローし、アプリサーバーを停止するようです。

どんな提案もありがたいです、ありがとう!

18
internetwhy

何が追加されたと思います

db.init_app(application)

application.pyでは、それ以来エラーは発生していません。

11
internetwhy

ロールバックをチェックするかどうかは毎回面倒です。

コミットが必要な関数を挿入、更新しました。

@app.teardown_request
def session_clear(exception=None):
    Session.remove()
    if exception and Session.is_active:
        Session.rollback()
6
leejaycoke

ここでは、MySqlがしばらくしてセッションを閉じるため、プールのリサイクルが欠落しているため、プールのリサイクルを追加して、プールの接続がプールのリサイクル時間後に再接続されるようにする必要があります。

app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600

0