【问题标题】:In a web request handler of python tornado, should a global connection of mysql be set or not?在 python tornado 的 web 请求处理程序中,是否应该设置 mysql 的全局连接?
【发布时间】:2015-02-05 02:06:13
【问题描述】:

这是来自tornado python框架的官方博客示例应用程序的代码。 还有一个问题让我很困惑:MysqlDB 连接在这个应用程序中被初始化为一个全局变量,但是如果高频请求到达,连接中断,那么整个应用程序就挂了?为什么不在每个请求处理程序中初始化一个新连接?这是一个更好的解决方案吗?

class Application(tornado.web.Application):
        def __init__(self):
            handlers = [
                (r"/", HomeHandler),
                (r"/archive", ArchiveHandler),
                (r"/feed", FeedHandler),
                (r"/entry/([^/]+)", EntryHandler),
                (r"/compose", ComposeHandler),
                (r"/auth/login", AuthLoginHandler),
                (r"/auth/logout", AuthLogoutHandler),
            ]
            settings = dict(
                blog_title=u"Tornado Blog",
                template_path=os.path.join(os.path.dirname(__file__), "templates"),
                static_path=os.path.join(os.path.dirname(__file__), "static"),
                ui_modules={"Entry": EntryModule},
                xsrf_cookies=True,
                cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
                login_url="/auth/login",
                debug=True,
            )
            tornado.web.Application.__init__(self, handlers, **settings)

            # Have one global connection to the blog DB across all handlers
            self.db = torndb.Connection(
                host=options.mysql_host, database=options.mysql_database,
                user=options.mysql_user, password=options.mysql_password)

【问题讨论】:

    标签: python mysql web tornado


    【解决方案1】:

    整个应用程序的单个 MySQL 连接是正确的设计。如果出现网络错误,一个请求会出现异常,但 MySQL 连接会为下一个请求重新连接,您的应用程序将恢复。内置连接池允许您的应用程序有多个套接字连接到 MySQL,以便一次等待多个 MySQL 操作。

    如果您在每个请求处理程序中创建一个新的 MySQL 连接,您将承担为每个 HTTP 请求设置到 MySQL 的 TCP 套接字的成本,以及登录 MySQL 的多次网络往返。你的表现会差很多很多。如果您测量它,我希望您会发现,如果您在每个请求处理程序中创建新的 MySQL 连接,您的请求延迟会受到严重影响。

    【讨论】:

    • 嗨,杰西,非常感谢您的帮助!你说的对,我查看tornado框架的源码发现它实现了自动连接Mysql的机制。
    • 嗨@Jesse,你在这里提到了“内置连接池”,对不起,我不明白你怎么知道torndb中有内置连接池?在我看来,只有一个数据库连接作为全局变量打开。如果系统被两个或多个请求同时访问,最后一个请求的db操作必须等到前一个db操作完成。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2016-02-18
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多