Tornado Web Framework Mysql连接处理

我最近一直在探索Tornado web框架,以便为许多不同的客户提供大量一致的连接。

我有一个基本上需要RSA加密字符串的请求处理程序并对其进行解密。 解密后的文本是一个XML字符串,由我编写的SAX文档处理程序解析。 一切正常,并且执行时间(每个HTTP请求)大约为100毫秒(通过解密和解析)。

XML包含用户的用户名和密码哈希。 我想连接到MySQL服务器以验证用户名是否与应用程序提供的密码哈希匹配。

当我基本上添加下面的代码:

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数据库服务器本身所需的时间内发生的。

我的问题是我如何加快速度? 我可以在全局范围声明MySQL连接,并通过创建一个新的游标在请求处理程序中访问它,或者由于Tornado的异步设计会遇到并发问题吗?

基本上,我怎么能不必为每个Http请求产生一个到MySQL服务器的新连接,所以它只需要几分之一秒而不是几秒钟来实现。

另请注意,SQL服务器实际上与Tornado Web服务器实例位于同一台物理机器上

更新

我只是通过一个探查器运行了一个简单的MySQL查询,下面是相同的代码。

对'connections.py' 初始化函数的调用需要4.944秒才能单独执行。 这看起来不正确,是吗?

更新2

我认为使用一个连接(甚至有一些连接非常简单的数据库连接池)运行速度足以处理每个龙卷风Web服务器实例的吞吐量。

如果1,000个客户端需要访问查询,典型的查询时间在几千秒内,最不幸的客户端只需要等待一秒钟就可以检索数据。


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

(另外,你不是在阻止异步请求处理程序中的数据库调用?)


一个SQL连接不应该花5秒钟。 尝试不发出查询,看看是否会提高你的表现 - 应该如何。

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

最后,DB-API具有查询的参数替换形式,不需要手动连接查询和转义参数:

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))

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

链接地址: http://www.djcxy.com/p/44767.html

上一篇: Tornado Web Framework Mysql connection handling

下一篇: Embed YouTube HTML5 Video