2008-12-22 79 views
2

我正在寫一個基本上查詢WMI和更新mysql數據庫中的信息的Python腳本。其中一個「寫你需要的東西」來學習編程練習。Mysql連接,一個還是很多?

例如,如果在腳本中間發生某些事情時,遠程計算機關閉,則會將其分離爲多個函數。

查詢一些WMI數據
更新到數據庫
查詢其他WMI數據
更新到數據庫

是更好地打開一開始一個MySQL連接,並把它打開或關閉每次更新後的連接?

看起來好像一個連接會使用更少的資源。 (儘管我只是在學習,所以這是一個完整的猜測)。然而,每次更新打開和關閉連接似乎更加「整潔」。函數會更獨立,而不是依賴於該函數之外的代碼。

回答

6

「不過,打開和關閉在每次更新的連接似乎更‘整潔’。」

這也是一個巨大的開銷的金額 - 並沒有實際的好處。

創建和處理連接相對昂貴。更重要的是,真正的原因是什麼?它如何改進,簡化和澄清?

通常,大多數應用程序都有一個連接,它們在開始使用時停止使用。

2

我不認爲有「更好」的解決方案。現在考慮資源還爲時過早。由於wmi非常慢(與sql連接相比),db不是問題。

只是讓它工作。然後做得更好。

在這裏使用開放連接的好處是,「自然」解決方案是使用對象而不僅僅是函數。所以這將是一個學習經驗(如果你正在學習python而不是mysql)。

1

仔細想一下:以下情形的時刻:

for dataItem in dataSet: 
    update(dataItem) 

如果你打開和關閉更新函數內的連接和你數據集包含了上千項,那麼你將破壞的性能您的應用程序並破壞任何交易功能。

更好的方法是打開連接並將其傳遞給更新函數。你甚至可以讓你的更新函數調用一個連接管理器的排序。如果您打算定期執行單個更新,請在您的更新函數調用周圍打開並關閉連接。

通過這種方式,您將能夠使用函數來封裝您的數據操作並能夠在它們之間共享連接。

但是,這種方法不適合執行批量插入或更新。

0

S.Lott's和Igal Serban的答案中有用的線索。我認爲你應該首先找出你的實際需求和代碼。

只是提一個不同的策略;一些應用程序保持一個數據庫池(或其他)的連接,並在事務的情況下只從該池中取出一個。這似乎很明顯,你只需要一個連接這種應用程序。但是你仍然可以保持一個連接池並應用以下內容;

  • 無論何時需要數據庫事務處理,連接都會從池中拉出並在結束時返回。
  • (可選)在一段時間後,連接已過期(並由新的連接取代)。
  • (可選)連接在一定的使用量後過期。
  • (可選)如果連接處於活動狀態並將其交給程序之前,池可以檢查(通過發送廉價查詢)。

這有點在單一連接和每筆交易連接策略之間。