SQLAlchemy连接池和会话

时间:2015-03-24 03:20:05

标签: python session flask sqlalchemy connection-pooling

我最近开始使用SQLAlchemy并尝试了解connection poolsessionweb-application

中的工作原理

我正在使用API构建flask

__初始化__。PY

engine = create_engine('mysql://username:password@localhost/my_database') 
DBSession = sessionmaker(bind=engine)

views.py

@app.route('/books', methods = ['GET'])
def getBooks():
    session = DBSession()
    returnedBooks = session.query(BOOK).all()
    session.close()

    return something...

1)首先,如果我没有明确关闭我的session对象,它会在request被处理后自动关闭吗?

2)当我的应用收到多个requests时,创建的多个session对象是否都链接到在我的engine文件中创建的单个__init__.py对象?

3)session对象是否在view.py connections connection pool中创建了dispose()对象?如果是这样,并且这些没有关闭,那么是否必须为后续请求建立新的连接?

4)我应该在某个时候使用{{1}}吗?

1 个答案:

答案 0 :(得分:12)

  

1)首先,如果我没有明确关闭我的会话对象,那么它   请求处理完毕后自动关闭?

垃圾收集器最终会在会话中调用__del__。如果会话尚未以其他方式排序,则可能会导致回滚。你通常应该这样做:

import contextlib
def myRequestHandler(args):
    with contextlib.closing(DBSession()) as session:
        result = do_stuff(session)
        if neccesary:
            session.commit() 
        else:
            session.rollback()
        return result
  

2)当我的应用收到多个请求时,是多个会话   正在创建的对象都链接到单个引擎对象   在我的__init__.py文件中创建?

是的,sessionmaker()保留所有Session配置。使用你已经获得的模式,你将获得每个请求的新会话,这是一件好事。

  

3)会话对象是否在view.py中创建了连接   连接池包含?

sessions and connections不是一回事;虽然每个会话一次使用一个连接,但是当它们完成后,它们会将它们的连接返回到池中。

  

如果是这样,那么这些都没有关闭   是否必须为后续请求建立新的连接?

different pool implementations有不同的规则,但对于大多数数据库引擎,默认值为QueuePool;它的默认最大连接数为15.对于其他连接的子序列请求将阻塞或超时。但是,尽可能重用连接。

  

4)我应该在某个时候使用dispose()吗?

通常不会,如果您还使用池和引擎和会话,则可能不需要提交/回滚会话之外的任何其他资源管理

*最终实际上意味着在某个时间之间和从不;不要指望它做有用的工作;请注意,当您的进程终止时,操作系统会强制关闭您的连接,因此使用GC进行连接管理不会给您带来任何好处。