[Flask] SQLAlchemy PoolTimeout

깨미·2021년 11월 2일
0

Flask

목록 보기
7/9
post-thumbnail
post-custom-banner

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()

참고
https://yongho1037.tistory.com/571

profile
vis ta vie
post-custom-banner

0개의 댓글