Python Tornado Web框架Mysql连接处理

Python Tornado Web框架Mysql连接处理,python,mysql,time,tornado,persistent-connection,Python,Mysql,Time,Tornado,Persistent Connection,我最近一直在探索Tornado web框架,以服务于许多不同客户机的许多一致连接 我有一个请求处理程序,它基本上接受RSA加密的字符串并对其解密。解密文本是一个XML字符串,由我编写的SAX文档处理程序解析。一切都很好,执行时间(每个HTTP请求)大约为100毫秒(包括解密和解析) XML包含用户的用户名和密码哈希。我想连接到MySQL服务器,以验证用户名是否与应用程序提供的密码哈希匹配 当我添加以下代码时: conn = MySQLdb.connect (host = "192.16

我最近一直在探索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()
conn=MySQLdb.connect(host=“192.168.1.12”, 用户=”, passwd=“”, db=”“) 游标=连接游标() safe_username=MySQLdb.escape_字符串(XMLLoginMessage.username) safe_pass_hash=MySQLdb.escape_字符串(XMLLoginMessage.pass_hash) sql=“从`mrad`.`users`中选择*。`username`='”+safe\u username+“'和`password`='”+safe\u pass\u hash+“'限制1;” cursor.execute(sql) cursor.close() 康涅狄格州关闭 执行HTTP请求所需的时间最多可达4-5秒!我相信这是连接到MySql数据库服务器本身所花费的时间造成的

我的问题是我怎样才能加快速度?我可以在全局范围内声明MySQL连接并通过创建一个新的游标在请求处理程序中访问它,还是会因为Tornado的异步设计而遇到并发问题

基本上,我如何不必在每次Http请求时都与MySQL服务器建立一个新连接,因此只需几秒钟而不是几秒钟即可实现

另外,请注意,SQL server实际上与Tornado Web server实例位于同一台物理计算机上

更新 我刚刚通过一个分析器运行了一个简单的MySQL查询,代码如下所示

单独执行对'connections.py'init函数的调用花费了4.944秒。这似乎不对,是吗

更新2 我认为,使用一个连接(甚至使用一个非常简单的DB conn池运行几个连接)将足够快,足以处理每个tornado web服务器实例的预期吞吐量


如果1000个客户端需要访问一个查询,典型的查询时间为数千秒,那么最倒霉的客户端只需等待一秒钟即可检索数据。

SQL连接不应花费5秒。尽量不要发出查询,看看这是否会提高您的性能—它应该这样做

Mysqldb模块的threadsafety为“1”,这意味着该模块是线程安全的,但不能在线程之间共享连接。您可以实现连接池作为替代方案

最后,DB-API有一个查询的参数替换表单,不需要手动连接查询和转义参数:

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))
考虑一下,它提供了比DBAPI更好的抽象,还提供了连接池等(您可以很高兴地忽略它的ORM,只使用SQL工具包)


(另外,您没有在异步请求处理程序中阻止数据库调用吗?

在基本处理程序中声明它,它将在每个应用程序中调用一次。

嗯,我不知道自动参数化的内容,这将非常有帮助。我明天会考虑删除这个查询,看看这会给我带来什么。我想我最后不得不写一个连接池。。。只是因为对DB的调用可能会阻止其他线程。这将是在测试我是否决定这样做。我知道我没有在上面的代码中执行阻塞调用,如果这是你要问的,我只是没有在示例中包含任何。最终,会有,但连接时间是什么让我。我相信我会尝试SQLAlchemy,所以谢谢你的回答!这5秒钟可能与数据库连接有关,而不是实际的查询。如果使用tornado,则可以全局连接数据库,然后将数据库参数与请求一起传递。