2009-12-17 109 views
5

我最近一直在探索Tornado web框架以通过许多不同的客户端来服务许多一致的连接。Tornado Web框架Mysql连接处理

我有一个请求处理程序,基本上需要一个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的异步设计会遇到并发问题吗?

基本上,我怎么能没有承担一个MySQL服务器每个HTTP请求一个新的连接,所以只需要几分之一秒,而不是多秒来实现。

而且,请注意,SQL服务器实际上是同一台物理机器的龙卷风Web Server实例

更新

我只是进行了简单的MySQL查询通过探查,相同的代码下方。

调用'connections.py'init函数花费了4.944秒来单独执行。这看起来不正确,是吗?

更新2

我认为,随着一个连接(或者甚至是一个非常简单的DB康恩池数)运行将是速度不够快处理,我每个龙卷风Web服务器实例预期的吞吐量。

如果1000个客户端需要访问查询,典型的查询时间在数千秒之中,最不幸的客户端将只需要等待1秒钟来检索数据。

+0

5秒可以与数据库连接相关,而不是实际查询,如果使用龙卷风,则可以在全局范围内连接到数据库,然后将db参数与请求一起传递。 – chuseuiti 2017-04-09 05:03:56

回答

1

考虑SQLAlchemy,它提供了一个DBAPI更好的抽象,并提供连接合并等(你可以愉快地忽略它的ORM和只使用SQL的工具包)

(同样,你不这样做的异步请求处理程序阻止数据库调用?)

+0

我知道我没有在上面的代码中执行Blocking调用,如果这就是您要求的,我只是没有在示例中包含任何内容。 最终,会有,但连接时间是什么让我。 我相信我会给SQLAlchemy一个尝试,所以谢谢你的回答! – 2009-12-17 18:54:38

1

SQL连接不应该花费5秒钟。尝试不发出查询,看看是否会提高你的表现 - 应该如何。

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

最后,DBAPI有这不会需要手动串联查询和逃避参数的查询参数替代形式:

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y)) 
+0

那么,我不知道自动参数化的东西,这将是非常有用的。 我会考虑明天删除查询并查看离开我的地方。 我想我将不得不编写一个连接池......只是因为有可能调用数据库会阻塞其他线程。它将在测试我是否决定这么做。 – 2009-12-17 08:02:45

0

声明它的基本处理程序,它会每个应用程序调用一次。