zoukankan      html  css  js  c++  java
  • 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()


  • 相关阅读:
    C#异步编程:多线程基础Thread类
    WPF:TextBox控件禁用中文输入
    C#:泛型的协变和逆变
    C#:泛型接口
    C#:泛型委托
    C#:泛型类
    Jetbrains Rider:缺少.NET Framework 4.5.2
    C#:泛型方法
    C#:泛型
    C#:接口
  • 原文地址:https://www.cnblogs.com/zzcflying/p/4285691.html
Copyright © 2011-2022 走看看