2011-07-27 8 views
1

私は公式のmongodb erlangドライバを試しています。私は医者を読んでいて、まだ理解できないことがあります。誰もがそれを使用するための正しい方法だものを私に伝えることができます願っています:erlang mongodbドライバを使用してdbアクションを作成する正しい方法は何ですか?

私がアクションを行うたびに、次のように、私はちょうど何かを書く:

{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. は、これは正しい方法ですか? dbアクションが完了するたびにConnが死んでしまったようです。または、次回のために再接続するために接続を切断するのではなく、Connを保持する必要がありますか? Connを保持するグローバル変数がないので、gen_serverのようなものを使用して再利用のためにConnをそのまま使用することができます。これは正しい方法ですか?

  2. また、connect_factoryメソッドがあります。しかし、私はそれに対処する適切な方法をかなり理解できません。 connect_factoryは大量のDBアクションを処理するために接続するよりも良い方法ですか?どのようにconnect_factoryを使用してConnを稼働させるには?

  3. これはmongodbとはあまり関係のない質問です。訪問したときにすべてのユーザーに一意の番号を付けたいと思います。だから私はDBにカウンタを保存しました。ユーザが訪問すると、カウンタは1だけ加算され、ユーザに一意の番号として返されます。しかし、私はいつも2人のユーザーが同時にdbを読むことで同じ数字を得るという心配があります。 mongodbを使ってユニークなカウンタを1ずつ増やすにはどうすればよいですか?

ありがとうございます!

答えて

5
  1. あなたのアクションにエラーがあった場合、Connが死ぬ可能性があります。そうでない場合は、再利用できるはずです。注:mongo:doはエラー時に{failure、X}を返します。 Connを再利用したい場合は、切断しないでください。ところで、disconnectは引数としてConnをとります。 Connをグローバル変数にしておきたい場合は、Erlangのマニュアルを参照してください(例ets table、gen_serverなど)。また、このドライバのmvarモジュールをチェックして、値を保持する簡単なgen_serverを探します。
  2. connect_factoryは、再利用可能な接続プールを維持するために使用されます。チュートリアルhttp://github.com/TonyGen/mongodb-erlangを読んでください。一番下には、resource_poolでconnect_factoryを使用する方法が示されています。
  3. MongoDBを使用してアトミックにインクリメントすることができます。 http://www.mongodb.org/display/DOCS/Atomic+Operations、特にfindAndModifyを参照してください。
関連する問題