QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/3o7r)
sql pool을 사용할 때 설정되어 있는 수 보다 많은 session을 사용하려고 할때 발생한다.
pool을 사용할 때 리소스를 반환해주지 않으면 내부적으로 pool을 관리하는 동작에 의해 원치 않는 동작이 수행될 수 있음. pool의 모든 리소스를 사용한 상태로 리소스 반환이 없어서 sqlalchemy의 pool_timeout=30 이라는 설정값에 의해 timeout 발생.
session commit 사용 후, flush나 close로 리소스를 반환할 수 있도록 해결.
밑에 코드는 참고용으로 만든 예제 코드이다.
#server_configuratioin.py
class DevelopmentConfig():
BIND_PORT = 8081
WEB_URL = "http://127.0.0.1"
SQLALCHEMY_DATABASE_URI = 'mysql://root:1234@127.0.0.1/example'
SQLALCHEMY_TRACK_MODIFICATIONS = False
# database.py
from flask_sqlalchemy import SQLAlchemy
class DBManager:
db = None
@staticmethod
def init(app):
db = SQLAlchemy(app)
DBManager.db = db
# main.py
from flask import Flask
from database import DBManager
from server_configuration import DevelopmentConfig
app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
DBManager.init(app)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
# User.py
from database import DBManager
db = DBManager.db
class Users(db.Model):
__tablename__ = 'users'
id = db.Column('id', db.Integer, primary_key=True)
uid = db.Column('uid', db.Integer, comment='사용자 아이디(숫자값)')
password = db.Column('password', db.String(256), comment='사용자 비밀번호')
name = db.Column('name', db.String(48), comment='사용자 이름')
# api.py
from database import DBManager
db = DBManager.db
def createUser():
user = Users()
user.uid = 1000
user.password = "1234"
user.name = "example"
db.session.add(user)
db.session.commit()
db.session.flush()