После нескольких дней поиска и прочтения документации по 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()
НоНичто из перечисленного не решает мою проблему. Буду очень признателен за любые предложения, как это исправить!