V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
RadAsm
V2EX  ›  Python

数据库连接池对象在何时创建比较好

  •  
  •   RadAsm · 2015-11-04 09:52:49 +08:00 · 3777 次点击
    这是一个创建于 3096 天前的主题,其中的信息可能已经有所发展或是发生改变。
    rt ,是在服务器启动进行初始化( init )的时候,还是等到有用户( User )需要使用到数据库的时候,进行创建呢?

    感觉一开始就可以了,但是又担心连接池对象占用资源。嗯。。。
    11 条回复    2015-11-05 10:44:41 +08:00
    li24361
        1
    li24361  
       2015-11-04 09:56:01 +08:00
    参照 spring 等框架,一般是初始化的时候,就建立的
    hyy
        2
    hyy  
       2015-11-04 09:56:38 +08:00
    我觉得用的时候再建比较好,不然耽误服务器启动时间,毕竟服务器启动后,可以马上服务其他不需要连接数据库的功能。
    ryanking8215
        3
    ryanking8215  
       2015-11-04 10:30:27 +08:00
    @hyy 创建快的话,也不会耽误多少服务器启动时间; 创建慢的话,到用的时候不就响应慢了。所以无论快慢在服务器起来的时候就创建啊。数据库对象池创建很慢吗?!
    awanabe
        4
    awanabe  
       2015-11-04 10:31:56 +08:00
    启动服务的时候.
    理由如下:
    1. 如何判断 用户第一次使用到数据库?
    2. 第一次使用初始化时间消耗.
    3. 启动服务没有启用数据库连接池, 如何判断连接池可以正常启用? 等到需要的时候发现不能启用, 那就哭.
    4. 连接池都说了是池了... 目的就是用于不过度重建+释放资源, 有效利用资源. 这种 pool 不都应该提前应用准备好么...
    Kisesy
        5
    Kisesy  
       2015-11-04 13:21:19 +08:00
    你卖东西的时候,是先摆好商品还是等顾客来时再摆呢?
    yuezhimsolo
        6
    yuezhimsolo  
       2015-11-04 13:46:53 +08:00
    预热
    beneo
        7
    beneo  
       2015-11-04 14:16:41 +08:00
    启动的时候难道不检查一下数据库到底能不能连得上么,呵呵
    iyaozhen
        8
    iyaozhen  
       2015-11-04 14:40:53 +08:00
    @Kisesy 我觉得楼主的意思是,并不知道这次请求会不会用上数据库,想等需要用的时候在连接。

    不过个人建议 init 的时候就连接吧,所有的初始操作都放进去,有利于 cache ,也方便别的阅读代码。万一连接方法有个啥调整,也好调整。
    jhdxr
        9
    jhdxr  
       2015-11-04 18:46:52 +08:00
    这个问题得分语言讨论。。。比如 java 之类的,那毫无疑问是启动时建好;而对于 php (每次请求会完整的走一遍创建到销毁这种生命周期的),楼主这问题才有讨论的价值,因为有可能有些请求我根本不涉及到数据库,那在创建时候建立就浪费了。。。
    haozhang
        10
    haozhang  
       2015-11-04 20:37:22 +08:00
    像池这类东西都应该是全局的啊...所以都应该在程序刚刚加载的时候创建,程序结束的时候销毁。是看程序的生命周期...
    xiaolee59
        11
    xiaolee59  
       2015-11-05 10:44:41 +08:00
    连接池的话一般是程序启动的时候就开出来。
    但如果是全局的单个连接的对象的话,其实就没必要占用程序启动的时间,在代码里按需启动即可,由第一个需要数据库连接的来初始化,然后大家共享就行。
    要考虑下你们的实际服务部署方式,想象一下一台物理机上开多个服务器进程的时候,假如太多东西都在程序初始化的时候启动的话,你的服务得多长时间才能启动完毕?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2871 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:57 · PVG 19:57 · LAX 04:57 · JFK 07:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.