Обработка сеансов MSSQL в Flask-SQLAlchemy - PullRequest
0 голосов
/ 15 октября 2018

После нескольких дней поиска и прочтения документации по SQLAlchemy и пробуя разные вещи, я до сих пор не понимаю, как это работает, поэтому давайте начнем со структуры проекта:

|───App
│   ├───Config
│   │   └───cfg.py
│   ├───Logic
│   └───Models
│       └───Models.py
├───Routes
├───PrivateAppName
│   └───Logic
│       ├───Admin
│       │   └─── AdminLogic.py
│       ├───Utils
│       │   └─── UtilsLogic.py
│       └───User
│           └─── UserLogic.py
└─── Main.py

В Models.pyпапку, которую я настроил следующим образом:

    try:
        from BackEnd.App.Config.cfg import DATABASE_CONNECTION
    except Exception:
        from App.Config.cfg import DATABASE_CONNECTION

    db = SQLAlchemy()

    app = Flask(__name__, static_url_path='/FrontEnd/Static')
    app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_CONNECTION
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    with app.app_context():
        db.init_app(app)

    migrate = Migrate(app, db)
    manager = Manager(app)
    manager.add_command('db', MigrateCommand)

    ... class models ...

    if __name__ == '__main__':
        manager.run()

И в моих модулях AdminLogic.py, UserLogic.py и UtilsLogic.py я импортирую соединение с БД следующим образом:

try:
    import BackEnd.App.Models.Models as models
except Exception:
    import App.Models.Models as models

И я использую это так, например:

models.db.session.query(models.User).all()

И, наконец, проблема возникает, когда я запускаю свой сервер и захожу в браузер, чтобы протестировать свое приложение и нажимать на кучу разных кнопок, которые отправляютзапросы к BackEnd.Проблема заключается в том, что запросы обрабатываются очень медленно, и в какой-то момент возникает следующая ошибка:

sqlalchemy.exc.TimeoutError: достигнуто ограничение QueuePool размера 5, переполнение 10, время ожидания истекло, время ожидания 30 (Справочная информация об этой ошибке: http://sqlalche.me/e/3o7r)

Когда я захожу в SQL Server Management Studio и проверяю свой сервер из монитора активности, я вижу множество процессов с моим именем хоста и 'Python 'в поле Application.

Итак, мой вопрос: как я могу избежать создания всех этих сессий, как я могу сделать так, чтобы 1 пользователь имел только 1 сессию и не получилошибка TimeoutError?

Я пытался охватить все строки, связанные с БД, в:

with current_app.app_context():
    models.db.whatever

И я также пытался:

models.db.session.close_all()
# AND
models.db.engine.dispose()

НоНичто из перечисленного не решает мою проблему. Буду очень признателен за любые предложения, как это исправить!

...