2016-04-13 66 views
1

我正在使用Python,Celery和cx_Oracle。共享共同對象(數據庫連接)的同時芹菜任務

我推出了一堆工人。這些工作人員共享數據庫連接對象。

這就是我如何創建數據庫連接對象(db_conn)。注意threaded=True paramenter:

db_conn = cx_Oracle.connect(user=db_user, 
          password=db_password, 
          dsn=dsn, 
          threaded=True) 

任務被這些工人運行主要由上執行一些查詢其需要幾秒鐘才能完成。幾個工人在時間上重疊的機會(併發)非常高。

我的問題是:我應該在共享數據庫連接對象(db_conn)時採取任何特殊措施嗎?

芹菜會自動照顧這些東西嗎?我的意思是,如果任務正在使用數據庫連接對象,Celery是否會讓其他任務等待,直到第一個工作人員完成運行?如果不是,那麼我怎麼才能允許每個工作人員只有在沒有其他工作人員正在使用它時才使用數據庫連接對象?

回答

1

我會確保你知道當其中一個查詢失敗時會發生什麼。每個新查詢是否開始自己的事務?你需要確保數據庫連接在你完成後正確關閉,但不是在這之前。

是否有一個真正的理由,你需要分享工人之間的db連接?每個芹菜工作者的一個db連接實現起來更簡單,維護更容易,不易出現錯誤,並且可以更好地控制打開/關閉連接。然後你可以在python中處理併發問題,而不是希望你的數據庫連接能夠以正確的順序通過。