django 关于数据库连接池加入研究

django为什么不原生支持连接池

连接池的好处这么多,django为什么不原生支持呢?
个人解读就是:
因为python是在GIL 环境下运行,连接池要是保存在thread中,在uwsgi或gunicorn fork运行,连接池的信息就没法共享了,这样反而加大数据库开销。
大家都知道,python的解释器是多种的,常见的cpython, pypy,jpython, 这是都是要做适配的。
最后一点,是业务业景不同,不是所有人都需要使用连接池
以上是浅见。可以附上你们的高见?

加入连接池的姿势

改源码方式

通过源码可以看出,load_backend来加载连接的,可以修改源加入自已写的连接池。
已经有过这样的案例https://www.jianshu.com/p/e210e6380ade
https://github.com/django/django/blob/master/django/db/utils.py

def load_backend(backend_name):
    """
    Return a database backend's "base" module given a fully qualified database
    backend name, or raise an error if it doesn't exist.
    """
    # This backend was renamed in Django 1.9.
    if backend_name == 'django.db.backends.postgresql_psycopg2':
        backend_name = 'django.db.backends.postgresql'

    try:
        return import_module('%s.base' % backend_name)
    except ImportError as e_user:
        # The database backend wasn't found. Display a helpful error message
        # listing all possible (built-in) database backends.
        backend_dir = os.path.join(os.path.dirname(upath(__file__)), 'backends')
        try:
            builtin_backends = [
                name for _, name, ispkg in pkgutil.iter_modules([npath(backend_dir)])
                if ispkg and name not in {'base', 'dummy', 'postgresql_psycopg2'}
            ]
        except EnvironmentError:
            builtin_backends = []
        if backend_name not in ['django.db.backends.%s' % b for b in
                                builtin_backends]:
            backend_reprs = map(repr, sorted(builtin_backends))
            error_msg = ("%r isn't an available database backend.\n"
                         "Try using 'django.db.backends.XXX', where XXX "
                         "is one of:\n    %s\nError was: %s" %
                         (backend_name, ", ".join(backend_reprs), e_user))
            raise ImproperlyConfigured(error_msg)
        else:
            # If there's some other error, this must be an error in Django
            raise

以应用加载的方式

# settings.py

INSTALLED_APPS = (
    'djorm_pool',
    ...
)

DJORM_POOL_OPTIONS = {
    "pool_size": 20,
    "max_overflow": 0,
    "recycle": 3600, # the default value
}

详情https://github.com/hugoren/djorm-ext-pool

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,840评论 6 427
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 3,127评论 1 3
  • 基本假设 1事出并非有因 2问题症状有时也具有正向功能 3合作与沟通是解决问题的关键 4不当的解决方法常是问题的所...
    温明春晓阅读 88评论 0 0
  • 秋晴胜似春,风扫九天尘。 云散稍飞逝,烟消不可寻。 花前无限爱,身后几番心。 空对天边月,西风梦故人。 (中华新韵)
    文山鹿阅读 622评论 17 35
  • 晚上在路边摊吃个麻辣烫,见识了协警查抓摩托仔的一幕。 两个协警骑车飞奔而来,一群摩托仔闻声四窜。一五十来岁的大叔动...
    莞湘往来阅读 202评论 0 0

友情链接更多精彩内容