实验环境: SQLAlchemy==1.2.0b2


SQLAlchemy 支持连接池, 在 create_engine 时添加相关参数即可使用.

连接池是一种标准技术,用于维护内存中长时间运行的连接,以便高效地重用,并提供对应用程序可能同时使用的连接总数的管理。

sqlalchemy数据库连接池的使用方式是延迟初始化,就是说一开始你调用create_engine(...)后创建的那个数据库池是空的,你后面通过session.connection()或者engine.connect()或者 Session = sessionmaker(bind=engine)才开始创建连接。

在连接池启用的情况下,session 只是对连接池中的连接进行操作: session = Session() 将 Session 实例化的过程只是从连接池中取一个连接,在用完之后使用 session.close() 还回到连接池中,而不是真正的关闭连接。

真正对数据库连接进行操作的应该是使用 engine 实例,比如 engine.dispose()

这篇文章讨论的就是create_engine 的配置参数, 其中重点是关于连接池配置的参数:

engine = create_engine(config.SQLALCHEMY_DATABASE_URI, pool_size=100, pool_recycle=5, pool_timeout=30, pool_pre_ping=True, max_overflow=0)  

指定连接池类:

from sqlalchemy.pool import QueuePool  
engine = create_engine('sqlite:///file.db', poolclass=QueuePool)  

禁用连接池:

from sqlalchemy.pool import NullPool  
engine = create_engine(  
         'postgresql+psycopg2://scott:tiger@localhost/test',
          poolclass=NullPool)

连接池禁用之后,sqlalchemy 会在查询之前创建连接,在查询结束,调用 session.close() 的时候关闭数据库连接。

连接池的几个名词:

  • pool=None, 连接池实例

  • poolclass=None, 连接池类

  • pool_size 连接数, 默认5

  • max_overflow 最多多几个连接,默认为10,意义是允许超过连接池限额即 poolsize 的数量,超过连接数限额 maxoverflow 之后不再允许创建新连接,而是要等待之前的连接完成操作。

  • pool_recycle 连接重置周期,默认-1, 表示连接在给定时间之后会被回收,注意不要超过 MySQL 默认时长 8 小时

  • pool_timeout 等待 pool_timeout 秒,没有获取到连接之后,放弃从池中获取连接

  • pool_pre_ping 每次有一个连接从连接池检出的时候, pre ping 会发出一个 “SELECT 1” 来检查 SQL 连接是否有效,如果有无效链接,则会重置此链接以及所有早于此连接的连接。

  • pool_reset_on_return=rollback() / commit() 在把连接放回连接池之前默认要执行的操作。