与gevent工作线程的django数据库连接池

django-db-pooling的Python项目详细描述


Django_db_池

使用gevent Gunicorn启用Django数据库连接池的修补程序 工人。

使用指南

  1. pip install django_db_pooling

  2. 在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()
    
  3. 设置^{} 对于大于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}},这意味着无限)以限制每个工作者基础上的最大并发连接。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java正则表达式查找但不包含在组中   java在for循环内的主线程中调用AsyncTask   java解析SOAP服务的响应时遇到问题。XML有什么问题?   java Servlet ClassNotFoundException出现在包中时。。。为什么?   Facebook SDK中的安卓 R.Java与应用程序R.Java冲突   java为什么我得到SSLProtocolexception:尝试发送http请求时握手失败?   java Base64编码字符串搜索   在htmlunit中选择java下拉菜单   java列表添加到HashMap   java设置断点的最短NOOP语句是什么?   java如何检索windows中所有应用程序最近使用的文件   java正则表达式,包含正向向后看和向前看   如何在java中通过API从url获取图像?   如何将for-each循环转换为Java流和lambda函数?   java如何使用jackson流式api解析给定的json?   java暂停调用方法jdbcTemplate。getDataSource()   java如何在使用getJdbcTemplate时使用union运算符设置sql查询的参数。查询(sql、新对象[]、行映射器)?   java我可以为HQL查询指定结果对象类型吗?   java Spring未满足的依赖项错误   maven试图重新定位poi jar,但未找到java类异常