django中的gevent友好数据库连接池
django-db-conn-pool的Python项目详细描述
多亏了sqlalchemy,我们可以在使用gevent的monkey补丁的同时将数据库连接池化。
它支持mysql,并在python 2.7、django 1.11、gevent 1.2和sqlalchemy 1.2下进行了测试。
此外,DjangoQueuePool是一个新的队列池,扩展了sqlalchemy的QueuePool:
- 重新使用突发流量溢出的数据库连接;
- 随着时间的推移,逐渐停用未使用的数据库连接。
请记住关闭不可用或过时的数据库连接:
- 关闭的连接将返回到池;
- 建议在任务完成后关闭它们。
- 如果可能,建议将CONN_MAX_AGE设置为0;
- 如果CONN_MAX_AGE是0,则连接将总是过时的。
fromdjango.dbimportconnectionsforconninconnections.all():conn.close_if_unusable_or_obsolete()
开始
- 安装数据库连接池
pip install django-db-conn-pool
- 将池添加到django数据库后端
DATABASES={'default':{'ENGINE':'django_db_conn_pool.mysqlalchemy','CONN_MAX_AGE':0,'POOL':db_conn_pool,...}}
- 选择并调整连接池参数
fromsqlalchemy.poolimportQueuePoolfromdjango_db_conn_pool.mysqlalchemy.poolimportDjangoQueuePooldb_conn_pool=slow_and_safe={'django_pool_class':QueuePool,# sqlalchemy's builtin queue pool class'django_pre_ping':True,# pre ping by django if dialect is None'django_reset_on_return':False,# use sqlalchemy's reset on conn return'pool_size':5,# daily traffic: reuse long connections'max_overflow':0,# burst traffic: do not overload the db'timeout':30,# burst traffic: > external api timeout'recycle':120,# should be smaller than mysql timeout'dialect':None,# sqlalchemy's mysql dialect instance'pre_ping':False,# sqlalchemy pre ping requires dialect'use_threadlocal':True,# every thread always get its same conn'reset_on_return':'rollback',# reset on every conn return by rollback}db_conn_pool=fast_and_sane={'django_pool_class':QueuePool,# sqlalchemy's builtin queue pool class'django_pre_ping':False,# no pre ping due to long mysql timeout'django_reset_on_return':True,# reset by rollback only when necessary'pool_size':5,# daily traffic: reuse long connections'max_overflow':10,# burst traffic: do not overload the db'timeout':30,# burst traffic: > external api timeout'recycle':3600,# to be much smaller than mysql timeout'dialect':None,# sqlalchemy's mysql dialect instance'pre_ping':False,# sqlalchemy pre ping requires dialect'use_threadlocal':False,# diff threads share the db connections'reset_on_return':None,# do not use sqlalchemy reset on return}db_conn_pool=fast_and_wild={'django_pool_class':DjangoQueuePool,# customized from sqlalchemy queue pool'django_pre_ping':False,# no pre ping due to long mysql timeout'django_reset_on_return':True,# reset by rollback only when necessary'django_core_pool_size':5,# retire no conn if achieving core size'django_unload_timeout':2,# wait some random time before overload'django_retire_interval':5,# retire few non-core conn per interval'django_retire_quantity':1,# retire few non-core conn per interval'pool_size':30,# daily traffic: recycle or retire conn'max_overflow':0,# burst traffic: put overflow into pool'timeout':30,# burst traffic: > external api timeout'recycle':3600,# to be much smaller than mysql timeout'dialect':None,# sqlalchemy's mysql dialect instance'pre_ping':False,# sqlalchemy pre ping requires dialect'use_threadlocal':False,# diff threads share the db connections'reset_on_return':None,# do not use sqlalchemy reset on return}
发布历史记录
1.0.0(2019-05-04)
- 生日