这里不啰嗦直接记录一下结论吧。
在使用sqlalchemy连接池的时候,配置好engine后部署项目,初始都是正常的。但经过一段时间后,再次调用接口将会发现连接池中的连接失效了,这很可能是你在连接池中设置的回收时间大于SQL数据库配置的未活动失效时间导致的。
查看数据库未活动超时时间
在MySQL中执行指令查看:
show variables like "interactive_timeout";
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 1800 |
+---------------------+-------+
一般来说数据库默认的超时时间是8小时,我这次就是遇到的数据库比较奇葩,30分钟闲置连接就会超时失效。所以一定要先确认数据库的这个超时参数实际是多少。
engine配置
配置SQLAlchemy的engine是很重要的,有些参数一定要知道,我这里的配置方式大致如下:
engine = create_engine(
"mysql+pymysql://user:password@127.0.0.1:3306/test?charset=utf8",
pool_size=10,
pool_recycle=1600,
pool_pre_ping=True,
pool_use_lifo=True,
echo_pool=True,
max_overflow=5
)
- pool_size: 连接池大小;
- pool_recycle:连接回收时间,这个值必须要比数据库自身配置的
interactive_timeout
值小; - pool_pre_ping:预检测池中连接是否有效,并替换无效连接;
- pool_use_lifo:使用后进先出的方式获取连接,允许多余连接保持空闲;
- echo_pool:会打印输出连接池的异常信息,帮助排查问题;
- max_overflow: 最大允许溢出连接池大小的连接数量。
总结
注意按需配置engine参数,sqlalchemy并不能随时知道连接池中的连接是否仍然有限,在应用程序中使用完一个连接后,记得调用close()
方法将连接放回连接池。
一定注意设置连接回收时间小于数据库配置的失效时间,还有很多有用的参数可以去https://www.osgeo.cn/sqlalchemy/core/pooling.html
这里看看,也对你有帮助。
网友评论