我正在用webpy編寫一個小型的web應用程序,我在想如果任何人有任何關於我遇到的小問題的信息。使用webpy線程特定的數據
我寫了一個小ORM系統,它似乎工作得很好。理想情況下,我想用webpy將它縫合,但似乎只是使用它會導致線程問題(數據庫連接在線程邊界實例化/訪問,或異常狀態)。
有誰知道我可以(在webpy中)在同一個線程上創建我的數據庫連接,其餘的頁面處理代碼將會是?
我正在用webpy編寫一個小型的web應用程序,我在想如果任何人有任何關於我遇到的小問題的信息。使用webpy線程特定的數據
我寫了一個小ORM系統,它似乎工作得很好。理想情況下,我想用webpy將它縫合,但似乎只是使用它會導致線程問題(數據庫連接在線程邊界實例化/訪問,或異常狀態)。
有誰知道我可以(在webpy中)在同一個線程上創建我的數據庫連接,其餘的頁面處理代碼將會是?
我們對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
替換會話與你的數據庫連接功能,它應該正常工作適合你。
我會試試這個。免責聲明:我沒有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。
您使用的是webpy的內置網絡服務器嗎? – 2009-01-20 03:08:07