2013-06-30 60 views
1

我在網上judge.I工作正在使用python 2.7和MySQL(因爲我在後端部分工作)的情況下
如何管理數據庫連接尤其是在多線程

我的方法:

我創建了一個主線程,它從數據庫中提取提交(每次10個)並將它們放入一個隊列中。然後我有多個線程從隊列中提交提交,對其進行評估並將結果寫回數據庫。

現在我有一些疑惑(我知道他們是來自不同主題的疑惑,但其中的一些方法也很受讚賞)。

  1. 當前,當我開始線程時,我給他們自己的db連接,他們使用。這是一個很好的做法,給每個線程一個連接。在線程之間共享連接是否會產生問題。我該如何解決這個問題。
  2. 我的主線程使用單個連接,因爲它的唯一工作是從數據庫提交提交併將其放入隊列中(還將其狀態更新爲數據庫評估提交)。但有時我會在查詢時收到錯誤:Lost connection to Mysql server。即使我停止了該程序並重新開始,我也一直在收到它。我該怎麼辦?我也應該只爲主線程實現一個連接池嗎?
  3. 還有一個數據庫連接保持永久?會話記憶等耗盡時如何處理?

回答

1
  1. 如果給每一個線程在同一個連接,則線程將無法查詢會發生數據庫和比賽條件。所以你需要爲每個線程提供單獨的連接,而且這確實是個好主意。使用連接池可以幫助您獲得不同的連接。

  2. 連接池一定會有所幫助。

  3. 工作結束後釋放連接。連接有一個限制,稱爲連接超時。所以你需要使用一些第三方庫來處理,c3p0是一個很好的庫,它可以幫助你。

請參考以下鏈接進行配置:

Best configuration of c3p0

+0

你能提供一個鏈接,我可以在python中瞭解連接池? –

+3

使用https://code.google.com/p/pysqlpool/ –

3
  1. 使用連接池。共享數據庫連接並不總是很糟糕,但你必須小心。您可以嘗試使用SQLAlchemy爲您管理很多這樣的設備:http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#unitofwork-contextual

  2. 服務器可能無法連接,您的連接可能因爲使用了太多資源而被殺死。等等。連接池可以幫助您解決這個。

  3. 這一切都依賴於它,它可以在理論上無限期地保持活力,但通常你有一個超時的地方。

+0

感謝點2真的很有用謝謝:) –