2013-02-14 39 views
10

我們有一個包含二十多個模塊的Python應用程序,其中大部分都由幾個Web和控制檯應用程序共享。我應該如何在多模塊Python應用程序中建立和管理數據庫連接?

我從來沒有清楚地瞭解在多模塊Python應用程序中建立和管理數據庫連接的最佳實踐。考慮這個例子:

我有一個模塊爲用戶定義一個對象類。它有很多用於在數據庫中創建/刪除/更新用戶的defs。 users.py模塊被導入到a)基於控制檯的實用程序中,2)基於web.py的web應用程序和3)持續運行的守護進程。

這三個應用程序的每一個都有不同的生命週期。守護進程可以打開連接並保持打開狀態。控制檯實用程序連接,確實工作,然後死亡。當然,http請求是原子的,但是web服務器是一個守護進程。

我目前正在打開,然後在Users類中的每個函數內使用關閉連接。這看起來效率最低,但它適用於所有示例。用作測試的替代方法是聲明並打開整個模塊的全局連接。另一個選擇是在頂層應用層創建連接並在實例化類時傳遞引用,但這對我來說似乎是最糟糕的主意。

我知道每個應用程序架構都不一樣。我只是想知道是否有最佳做法,它會是什麼?

+0

看看連接池按照這個[question](http://stackoverflow.com/questions/98687/what-is-the-best-solution-for-database-connection-pooling-in-python) – Mark 2013-02-14 20:48:49

回答

9

最好的方法是當你需要做一些操作(如獲取和/或更新數據)時打開連接;操縱數據;將其寫回數據庫一個查詢(對性能非常重要),然後關閉連接。打開連接是一個相當輕的過程。

一些陷阱性能包括

  • 打開數據庫時,你會不會肯定它
  • 使用需要更多的數據比你的需要(例如,讓所有用戶數據,並對其進行篩選選擇與互動在Python中,而不是要求MySQL過濾出無用的數據)
  • 寫入沒有改變的值(例如更新用戶配置文件的所有值,僅當他們的電子郵件已經改變時)
  • 每個字段更新服務器單獨(例如,打開數據庫,更新用戶電子郵件,關閉數據庫,打開數據庫,更新用戶密碼,關閉數據庫,打開...你明白了)

底線是打開數據庫的次數並不重要,它是您運行多少個查詢。如果你可以讓你的代碼加入相關的查詢,你就贏得了這場戰鬥。

+0

這個正是我所尋找的,證實了我最好的猜測,並且意味着我不必「重做任何東西!感謝您的額外提示 - 我已經在做所有這些,但這是一個很好的清單。 – hikaru 2013-02-14 21:08:31

4

MySQL連接速度相對較快,所以這可能不成問題(即您應該測量)。大多數其他數據庫需要更多資源來創建連接。

當你需要一個連接時創建一個新連接總是最安全的,並且是一個不錯的首選。一些db庫,例如SqlAlchemy,內置連接池透明地將正確地重新使用連接。

如果你決定要保持連接活着,這樣就可以重新使用它,有幾點需要注意:

  1. 連接是僅用於閱讀更容易比您用來修改數據庫數據的連接重用。

  2. 當你在一個連接上啓動一個事務時,要小心在你使用它的時候沒有別的東西可以使用這個連接來做別的事情。

  3. 長時間坐着的連接會變得過時並且可能從下面關閉,所以如果您要重新使用連接,則需要檢查它是否仍然「活着」,例如,通過發送「選擇1」並驗證您獲得結果。

我個人建議不要實施自己的連接池算法。當事情出錯時真的很難調試。相反,選擇一個數據庫庫爲你做。

相關問題