【问题标题】:Persistent MySQL connections in PythonPython 中的持久 MySQL 连接
【发布时间】:2009-12-12 23:49:34
【问题描述】:

PHP 提供 mysql_connect() 和 mysql_pconnect() 允许创建临时和持久的数据库连接。

Python 中是否有类似的功能?使用它的环境是带有 FastCGI 的 lighttpd 服务器。

谢谢!

【问题讨论】:

    标签: python mysql web-services


    【解决方案1】:

    如果您使用 FastCGI,则不需要“持久连接”,因为如果您创建连接,则默认情况下它是持久的,因为 FastCGI python 不是基于请求的,而是持续运行的。

    这就是 FastCGI 在 python 中的工作方式,简而言之:

    1. Run startup code
    2. Run request function
    3. Wait for new request, then goto step 2.   
    

    在 PHP/FastCGI 中这是不同的,因为只有 PHP 引擎一直被加载,而 PHP 脚本本身为每个请求执行。

    1. Start PHP Engine
    2. Run script
    3. Wait for new request, then goto step 2.
    

    所以不同的是,在 Python 中你可以定义自己的初始化。这就是你放置 MySQL 连接的地方。 :)

    【讨论】:

    • 我不太确定它是如何工作的,这可能是因为我对 Python 和 PHP 都很陌生。即使使用 Python,对网络服务器的每个请求都是独立处理的,在这种情况下如何保持连接?当我尝试重新连接到它时,MySQL模块是否会以某种方式缓存连接并重用同一个?
    • 即使您是单个 FastCGI(或其他持久性)实例,您仍然需要一种非常基本的连接池形式。否则,如果您在几个小时内没有收到请求,MySQL 连接将过期并在您尝试使用它时给您一个例外。任何常用的数据访问层都会免费为您提供连接池,但如果您使用的是原始 DB-API,您可能需要一点手动池。
    【解决方案2】:

    注意:持久连接会对系统性能产生非常负面的影响。如果您有大量的 Web 服务器进程都与您的数据库服务器保持持久连接,您可能会耗尽数据库服务器的连接限制。这是您需要在重模拟负载下对其进行测试的区域之一,以确保您不会以 100 英里/小时的速度撞墙。

    【讨论】:

    • 问题是关于如何建立持久连接,而不是为什么
    • @analogue:感谢您在提出问题 2 年多后的精彩见解。我没有评论他是否应该这样做。我只是提出了这样的观点,即持久连接的明显好处可能被有据可查的 DBMS 服务器连接耗尽问题所抵消,尤其是在高负载下。这是大多数新手都忽略的一点。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2013-06-05
    • 2012-08-27
    相关资源
    最近更新 更多