龙卷风Web框架MySQL连接处理
-
20-09-2019 - |
题
我最近一直在探索龙卷风的web框架由许多不同客户的服务有很多一致的连接。
我有一个请求处理程序,基本上需要一个RSA加密的字符串和解密。解密的文本是得到由我写一个SAX文档处理程序解析的XML字符串。一切工作完全正常和(每个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连接,并通过创建一个新的游标访问的请求处理程序,或将运行到因为龙卷风的异步设计?
并发问题基本上,我怎样才能没有招致到MySQL服务器每个HTTP请求一个新的连接,所以只需要几分之一秒,而不是多个秒来实现。
另外,请注意,SQL服务器实际上是同一台物理计算机上的龙卷风Web Server实例
更新
我只通过一个分析器,下同代码。
进行了简单的MySQL查询为 'connections.py' 呼叫的初始化强>函数把4.944秒单独执行。这似乎不正确的,不是吗?
更新2
我觉得用一个连接(或者甚至是一个非常简单的DB康恩池数)运行将是速度不够快处理,我每个龙卷风Web服务器实例预期的吞吐量。
如果1000个客户端需要访问查询,典型的查询时间在数千秒之中,最不幸的客户端将只需要等待1秒钟来检索数据。
解决方案
考虑 SQLAlchemy的,该提供了DBAPI一个更好的抽象,并且还提供连接池等(你可以愉快地忽略它的ORM和只使用SQL的工具包)
(另外,你不这样做的异步请求处理程序阻止数据库调用?)
其他提示
这是SQL连接不应该采取5秒。尽量不发出一个查询,看看是否能提高你的表现 - 这是它应该
在MySQLdb的模块具有的“1”,这意味着该模块的threadsafety是线程安全的,但连接不能之间线程共享。你可以实现一个连接池作为替代。
最后,DB-API具有用于将不要求手动串联的查询和避开参数的查询的参数替换形式:
cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))
声明它在基本处理程序,将每个应用程序被调用一次。