我最近一直在探索 Tornado 网络框架,为许多不同的客户端提供大量一致的连接。
我有一个请求处理程序,基本上采用 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”init 函数的调用单独执行需要 4.944 秒。这似乎不对,是吗?
更新2
我认为运行一个连接(或什至几个具有非常简单的 DB conn 池)的速度足以处理我期望的每个 tornado Web 服务器实例的吞吐量。
如果 1,000 个客户端需要访问一个查询,典型的查询时间为数千秒,最不幸的客户端只需等待一秒钟即可检索数据。
最佳答案
考虑 SQLAlchemy ,它提供了比 DBAPI 更好的抽象,还提供了连接池等。(你可以愉快地忽略它的 ORM,只使用 SQL 工具包)
(此外,您没有在异步请求处理程序中执行阻塞数据库调用?)
关于python - Tornado Web 框架 Mysql 连接处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920012/