问题背景

最近新的产品开发中,使用了到了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()

tornado中使用torndb,连接数过高的问题的更多相关文章

  1. 基于python3.x,使用Tornado中的torndb模块操作数据库

    目前Tornado中的torndb模块是不支持python3.x,所以需要修改部分torndb源码即可正常使用 1.开发环境介绍 操作系统:win8(64位),python版本:python3.6(3 ...

  2. 查看linux中的TCP连接数【转】

     转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:   计算机网络知识库  分类: ...

  3. 在tornado中使用celery实现异步任务处理之中的一个

    一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...

  4. winxp iis5中修改最大连接数及添加多个站点

    winxp iis5中修改最大连接数及添加多个站点 最 近用asp做一些东西,需要用到iis,还需要用photoshop做一些图片.以前都是在win2003下面做,可是photoshop里面很多中文字 ...

  5. 深入tornado中的TCPServer

    1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以 ...

  6. AIX 中 Paging Space 使用率过高的分析与解决

    AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高.系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起.针对这种情况,通常可以靠增加Paging ...

  7. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  8. Tornado 中的 get() 或 post() 方法

    ---恢复内容开始--- Tornado 中的 get() 或 post() 方法 请求处理程序和请求参数 Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.we ...

  9. 深入tornado中的协程

    tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...

随机推荐

  1. Ubuntu系统下USB转串口的使用

    PC系统是Ubuntu12.04,与路由器开发板之间用USB转串口线连接. 一.硬件连接 确认Ubuntu对USB转串口设备的支持. 1.# lsmod | grep usbserial如果有usbs ...

  2. 如何用js获取当前url的参数值

    <script language = javascript> function request(paras){ var url = location.href; var paraStrin ...

  3. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL/SQL Statement ignored 问题

    前段时间由于修改SMES系统,出现了一个问题. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL ...

  4. 开源 P2P 直播 视频会议

    转自:http://blog.csdn.net/pkueecser/article/details/8223074 一个P2P点播直播开源项目:P2PCenter(我转过来的时候发现已经都打不开了.. ...

  5. 《Dive into Python》Chapter 2 and Chapter 3 笔记

    Example 2.1. odbchelper.py def buildConnectionString(params): """Build a connection s ...

  6. 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  7. 《云大课程助手》Android刷课工具来袭

    云大课程助手(Android)谨以此app纪念我这四年的大学生活.希望大家用的愉快. 下载地址:http://zhushou.360.cn/detail/index/soft_id/922292注:已 ...

  8. C# 连接Oracle数据库

    最近项目要用Oracle数据库,之前没搞过,近2天遇到好多问题,现在总结一下,做个备份. 一.关于Oracle安装 1.服务器端 从Oracle官网下载文件,file1和file2,解压之后安装就行了 ...

  9. java 页面换行处理

    在taxtarea中输入的文本.如果含有回车或空格.在界面上显示的时候则不哪么正常.回车消失了,空格变短了. 如何解决这个问题呢.有2种方法. 1.使用<pre>标签 w3c对pre元素是 ...

  10. Graham's Scan算法

    原文链接:http://www.cnblogs.com/devymex/archive/2010/08/09/1795392.html C++/STL实现: #include <algorith ...