在python tornado的web请求处理程序中,是否应该设置mysql的全局连接?

时间:2014-12-07 07:37:43

标签: python mysql web tornado

这是来自龙卷风python框架的官方博客示例应用程序的代码。 有一个问题令我感到困惑:在这个应用程序中,MysqlDB连接被初始化为gloal var ,但是如果高频请求到达,并且连接中断,那么整个应用程序都会关闭?为什么不在每个请求处理程序中初始化一个新连接?这是更好的解决方案吗?

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)

1 个答案:

答案 0 :(得分:1)

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

如果在每个请求处理程序中创建一个新的MySQL连接,则会为每个HTTP请求设置为MySQL设置TCP套接字的成本,以及几次登录MySQL的网络往返。你的表现会更糟,更糟糕。如果你测量它,我希望如果你在每个请求处理程序中创建一个新的MySQL连接,你会发现你的请求延迟会很糟糕。