【发布时间】:2010-12-27 13:27:49
【问题描述】:
我最近一直在探索 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 Server 实际上与 Tornado Web Server 实例在同一台物理机器上
更新
我刚刚通过分析器运行了一个简单的 MySQL 查询,下面的代码相同。
单独执行对“connections.py”init 函数的调用需要 4.944 秒。这似乎不对,是吗?
更新 2
我认为使用一个连接(或者甚至几个使用非常简单的 DB 连接池)运行将足够快,可以处理我期望的每个 tornado Web 服务器实例的吞吐量。
如果 1,000 个客户端需要访问一个查询,典型的查询时间是数千秒,最不幸的客户端只需等待一秒钟即可检索数据。
【问题讨论】:
-
5秒可能与数据库连接有关,与实际查询无关,如果您使用tornado,您可以全局连接到db,然后将db参数与请求一起传递。跨度>
标签: python mysql time tornado persistent-connection