2011-07-27 42 views
1

我正在嘗試官方的mongodb erlang驅動程序。我閱讀了文檔,但仍然有些東西我不明白。希望誰能告訴我什麼是使用它的正確方法:使用erlang mongodb驅動程序進行數據庫操作的正確方法是什麼?

每次我做一個動作,我剛寫的東西如下:

{ok, Conn} = mongo:connect ({localhost, 27017}). 
mongo:do (safe, master, Conn, test, fun() -> 
    mongo:save (foo, {'_id', 1, bbb,22, y,2}), 
    mongo:save (foo, {'_id', 4, bbb,22, y,2}) end). 
mongo:disconnect(). 
  1. 這是一個正確的方式?每次我完成一個數據庫操作,Conn似乎都死了。或者我應該保留Conn而不是斷開連接以便下次再使用它?沒有全局變量可以保留Conn,所以我想出來的唯一方法就是使用類似gen_server的東西,並將Conn保存在其狀態中以供重用。這是正確的方式嗎?

  2. 我也看到有一個connect_factory方法。但我無法弄清楚處理這個問題的正確方法。是connect_factory比連接處理大量的數據庫操作更好的方法?以及如何通過使用connect_factory獲得可行的Conn

  3. 這是一個與mongodb不太相關的問題。我想在每次訪問時給每個用戶一個唯一的號碼。所以我在db中保存了一個計數器,當用戶訪問時,計數器加1並作爲唯一編號返回給用戶。但是我總是擔心兩個用戶同時讀取db時會得到相同的數字。如何使用mongodb將獨特的計數器增加1?

非常感謝!

回答

5
  1. 如果您的操作有錯誤,Conn可能會死亡,否則它應該是可重用的。請注意,mongo:在出錯時返回{failure,X}。如果您想重複使用它,請不要斷開連接。順便說一下,斷開連接需要康恩作爲參數。如果你想將Conn保存在一個全局變量中,那麼可以參考Erlang文檔中的方法來實現這一點(例如ets table,gen_server等)。此外,請查看此驅動程序中的mvar模塊以獲取包含值的簡單gen_server。
  2. connect_factory用於維護可重用的連接池。閱讀教程http://github.com/TonyGen/mongodb-erlang。最後,它顯示瞭如何將connect_factory與resource_pool一起使用。
  3. 你可以使用MongoDB自動遞增。請參閱http://www.mongodb.org/display/DOCS/Atomic+Operations,特別是findAndModify。
相關問題