python - Tornado Web 框架 Mysql 连接处理

标签 python mysql time tornado persistent-connection

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

相关文章:

python - 测量外部程序的用户+系统运行时间

mysql - 本地运行的Docker容器无法建立与远程MySQL数据库的连接

mysql - 如何在 MySQL 中获得减去 6 周的时间戳?

mysql - 如何选择SQL数据库表中的第n行?

r - 用R将时间格式转换为数字

java - 如何在 Java 8 中解析 LDAP 通用时间?

python - 将数据框转换为 JSON(在 pyspark 中),然后选择所需的字段

python - 我可以使用具有已知步骤的排序数组来制作 O(1) 搜索算法吗?

python - 在 HoloViews 中为 Datashader 着色点和选择聚合方法

java - 两次之间的时间差(以分钟为单位)