2009-01-19 53 views
2

我正在用webpy編寫一個小型的web應用程序,我在想如果任何人有任何關於我遇到的小問題的信息。使用webpy線程特定的數據

我寫了一個小ORM系統,它似乎工作得很好。理想情況下,我想用webpy將它縫合,但似乎只是使用它會導致線程問題(數據庫連接在線程邊界實例化/訪問,或異常狀態)。

有誰知道我可以(在webpy中)在同一個線程上創建我的數據庫連接,其餘的頁面處理代碼將會是?

+0

您使用的是webpy的內置網絡服務器嗎? – 2009-01-20 03:08:07

回答

4

我們對web.py使用SQLAlchemy,並使用鉤子爲每個請求創建和關閉數據庫連接。 SQLAlchemy處理池,所以不是每個連接都是tcp連接。

要使用的線程本地存儲是web.ctx ie。無論何時訪問web.ctx,您只能看到該線程設置的屬性。

我們的代碼看起來是這樣的:

def sa_load_hook(): 
    web.ctx.sadb = Session() 

def sa_unload_hook(): 
    web.ctx.sadb.close() 

web.loadhooks['sasession'] = sa_load_hook 
web.unloadhooks['sasession'] = sa_unload_hook 

替換會話與你的數據庫連接功能,它應該正常工作適合你。

2

我會試試這個。免責聲明:我沒有web.py框架的經驗。

我建議你嘗試以下方法:

(1)建立一個全球性的threading.local實例來跟蹤你的線程本地對象(在你的情況下,將只保留一個對象的軌跡,一個數據庫會話)。

import threading 
serving = threading.local() 

(2)在每個請求的開始,建立一個數據庫連接/會話,並且將其保存在threading.local實例。如果我理解正確的web.py documentation,你可以做到以下幾點:

def setup_dbconnection(handler): 
    serving.dbconnection = create_dbconnection(...) 
    try: 
     return handler() 
    finally: 
     serving.dbconnection.close() # or similar 

app.add_processor(setup_dbconnection) 

(3)在您的控制器方法(如果他們是所謂的,在web.py?),當你需要一個數據庫連接,使用服務.dbconnection。