与gevent工作线程的django数据库连接池
django-db-pooling的Python项目详细描述
Django_db_池
使用gevent Gunicorn启用Django数据库连接池的修补程序 工人。
使用指南
pip install django_db_pooling
在wsgi.py中:
import os import pymysql from django.core.wsgi import get_wsgi_application from django_db_pooling import pooling pymysql.install_as_MySQLdb() os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxxx.settings") application = get_wsgi_application() pooling.set_pool_size(4) pooling.apply_patch()
设置^{
} 对于大于0且小于MySQL的wait_timeout
的值,例如60秒通常是 足够好的价值。
工作原理
连接池修补
的__getitem__
方法
django.db.utils.ConnectionHandler
这样数据库连接
可以跨多个请求/绿色let重用,直到conn_max_age
达到。
默认情况下,Django在线程本地管理数据库连接对象
在django.db.utils.ConnectionHandler
中属性化_connections
,以便
每个线程都有自己的数据库连接对象,以避免竞争条件。
它还允许通过指定正值或
在conn_max_age
设置上没有,以避免启动和释放连接
每一个请求。但是,当与gevent工作人员一起使用时会导致问题
在gunicorn中,thread local属性由一个绿色的let local修补
属性:如果不重用绿色let,则数据库连接对象
与green let关联的将不会被释放或回收,除非它是垃圾
由MySQL收集或关闭在中型或重型负载下,那些空闲的
连接可能会累积,最终达到mysql的连接限制
以便不再建立新的连接。
为了解决上述问题,这个补丁添加了一个非本地属性
connection_pool
。它是一个字典,键是连接别名
值是池连接对象的列表。每当有新的请求
启动时,池中的连接对象将被重用,如果有任何新的
已创建连接对象连接对象将绑定到
_connections
要与当前请求关联的属性。潜在的
如果达到conn_max_age
,连接将关闭并重新打开。当电流
请求完成后,如果池仍然存在,则连接对象将被回收到池中
具有由方法set_pool_size()
设置的容量(如果没有,则默认为1
指定)。否则连接对象将被释放,并且
连接立即关闭。
在极重的负载下,最好限制
古尼科恩的工人
(--worker_connections)
确保整个并发数据库连接小于最大值。
mysql中允许的同时连接
(--max_connections)。
或者,set_pool_size()
方法接受一个附加参数
{{CD15}}(默认为{{CD16}},这意味着无限)以限制每个工作者基础上的最大并发连接。