代码之家  ›  专栏  ›  技术社区  ›  Crowe T. Robot

Tornado Web框架Mysql连接处理

  •  5
  • Crowe T. Robot  · 技术社区  · 16 年前

    我最近一直在探索Tornado web框架,以服务于许多不同客户机的许多一致连接。

    我有一个请求处理程序,它基本上接受RSA加密的字符串并对其解密。解密文本是一个XML字符串,由我编写的SAX文档处理程序解析。一切都很好,执行时间(每个HTTP请求)大约为100毫秒(包括解密和解析)。

    当我添加以下代码时:

    conn = MySQLdb.connect (host = "192.168.1.12",
                    user = "<useraccount>",
                    passwd = "<Password>",
                    db = "<dbname>")
        cursor = conn.cursor()
    
        safe_username = MySQLdb.escape_string(XMLLoginMessage.username)
        safe_pass_hash = MySQLdb.escape_string(XMLLoginMessage.pass_hash)
    
        sql = "SELECT * FROM `mrad`.`users` WHERE `username` = '" + safe_username + "' AND `password` = '" + safe_pass_hash + "' LIMIT 1;"
    
        cursor.execute(sql)
    
                cursor.close()
        conn.close()
    

    执行HTTP请求所需的时间最多可达4-5秒!我相信这是连接到MySql数据库服务器本身所花费的时间造成的。

    基本上,我如何不必在每次Http请求时都与MySQL服务器建立一个新连接,因此只需几秒钟而不是几秒钟即可实现。

    另外,请注意,SQL server实际上与Tornado Web server实例位于同一台物理计算机上

    我刚刚通过一个分析器运行了一个简单的MySQL查询,代码如下所示。

    调用“connections.py” 函数单独执行花费了4.944秒。这似乎不对,是吗?

    我认为,使用一个连接(甚至使用一个非常简单的DB conn池运行几个连接)将足够快,足以处理每个tornado web服务器实例的预期吞吐量。

    如果1000个客户端需要访问一个查询,典型的查询时间为数千秒,那么最倒霉的客户端只需等待一秒钟即可检索数据。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Alex Brasetvik    16 年前

    考虑 SQLAlchemy ,它提供了比DBAPI更好的抽象,还提供了连接池等(您可以很高兴地忽略它的ORM,只使用SQL工具包)

    (另外,您没有在异步请求处理程序中阻止数据库调用?)

        2
  •  1
  •   Yann Ramin    16 年前

    Mysqldb模块的threadsafety为“1”,这意味着该模块是线程安全的,但不能在线程之间共享连接。您可以实现连接池作为替代方案。

    最后,DB-API有一个查询的参数替换表单,不需要手动连接查询和转义参数:

    cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))
    
        3
  •  0
  •   Rick    15 年前

    在基本处理程序中声明,每个应用程序将调用一次。