2009-12-17 42 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

聲明它的基本處理程序,它會每個應用程序調用一次。