我最近一直在探索Tornado Web框架,以便为许多不同的客户提供大量一致的连接.
我有一个请求处理程序,基本上采用RSA加密字符串并解密它.解密的文本是一个XML字符串,由我编写的SAX文档处理程序解析.一切都很好,执行时间(每个HTTP请求)大约是100毫秒(解密和解析).
XML包含用户的用户名和密码哈希.我想连接到MySQL服务器以验证用户名是否与应用程序提供的密码哈希相匹配.
当我基本上添加以下代码时:
conn = MySQLdb.connect (host = "192.168.1.12",
user = "",
passwd = "",
db = "")
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 conn池)运行将足够快以处理我期望的每个龙卷风web服务器实例的吞吐量.
如果1,000个客户端需要访问查询,典型的查询时间在几千秒内,那么最不幸的客户端只需要等待一秒钟来检索数据.