我最近一直在探索 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 个客户端需要访问一个查询,典型的查询时间是数千秒,最不幸的客户端只需等待一秒钟即可检索数据。