5

我最近一直在探索 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

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

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

4

3 回答 3

1

SQL 连接不应花费 5 秒。尽量不要发出查询,看看这是否会提高你的性能——它应该这样做。

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

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

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))
于 2009-12-17T07:50:36.260 回答
1

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

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

于 2009-12-17T17:30:08.343 回答
0

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

于 2010-09-30T22:14:10.790 回答