tornado中使用torndb,连接数过高的问题

问题背景

最近新的产品开发中,使用了到了Tornado和mysql数据库。但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show processlist,发现连接数很高,我就将目标锁定在程序代码和torndb上了。

探索原因

当我kill掉tornado的进程时候,连接数就会被关闭,所以果断判断会不会是torndb的原因,导致我连接没有断开。于是我猜想会不会是在tornado服务挂掉的时候,mysql的连接没关。而且我想到我是在测试环境,开启了DEBUG模式,所以我利用的是tornado的autoreload的功能。

所以问题可能是tornado的autoreload出现了问题,这个时候mysql没有关闭所有连接,而autoreload 的时候又重新建立了连接,因为python是脚本语言,脚本没停,api重新加载,那么肯定是重新实例化了application的 时候重新建立了连接,而mysql的实例还在,所以就没有释放之前的连接,又叠加了连接。

验证猜想

为了验证我的猜想,我又做了以下的测试,同样开启两个终端,一个在tail -f mysqld.log的日志,另一个后台运行tornado,然后我随便修改了下一个文件,保存后退出,果然连接数翻倍。所以最终问题肯定就是因为mysql的连接没有释放了。接下来我做的修改就是在tornado中加了一个hook,在重启前add_reload_hook中增加了一个release的函数,如下:

 

def release():
    from lib.query import _mysql_server
    for key in _mysql_server:
        db = _mysql_server[key]
        db.close()

def run():
    application_settings = {
        'handlers': urls,
        'debug': DEBUG,
    }
    application = tornado.web.Application(**application_settings)
    options.parse_command_line()

    init_log(options.log_dir)
    application.listen(options.port)
    io_loop = tornado.ioloop.IOLoop.instance()

    # 这段代码是解决autoreload造成连接数没有断开的问题
    tornado.autoreload.add_reload_hook(release)
    tornado.autoreload.start(io_loop)

    io_loop.start()


posted on 2015-02-11 11:29  TonyCoolZhu  阅读(3696)  评论(0编辑  收藏  举报

导航