2016-04-05 12 views
3

私はgo appでデータベースとしてMongoDB(gopkg.in/mgo.v2パッケージ)を使用しています。 MongoDBのベストプラクティスによると、アプリケーションの開始時に接続を開き、アプリケーションが終了するときに接続を終了する必要があります。私はmain機能でこのコードを実行する場合GoでMongoDBセッションを正しく操作する方法は?

session, err := mgo.Dial(mongodbURL) 
if err != nil { 
    panic(err) 
} 
defer session.Close() 

すべてが良いだろう。その接続は、私がdefer建設を使用することができます閉じられますを確認します。しかし、私はこのコードを別のgoファイルに入れたいと思っています。メソッドが実行された後、このセッションは終了します。MongoDBのベストプラクティスに従って、Golangでセッションを開いたり閉じたりする最良の方法は何ですか?

答えて

4

このようなことができます。 DB初期

package common 

    import "gopkg.in/mgo.v2" 

    var mgoSession *mgo.Session 

    // Creates a new session if mgoSession is nil i.e there is no active mongo session. 
    //If there is an active mongo session it will return a Clone 
    func GetMongoSession() *mgo.Session { 
     if mgoSession == nil { 
      var err error 
      mgoSession, err = mgo.Dial(mongo_conn_str) 
      if err != nil { 
       log.Fatal("Failed to start the Mongo session") 
      } 
     } 
     return mgoSession.Clone() 
    } 

Cloneに行い、元のセッションと同じソケットを再利用したパッケージを作成します。あなたは、このメソッドを呼び出すことができ、他のパッケージで今

package main 

session := common.GetMongoSession() 
defer session.Close() 
+0

ありがとうございます! – Cortwave

+0

Clone()で作成した場合、実際にクローズセッションが必要ですか? –

2

延期後のコード (の他の部分にセクションを渡す)、

func main(){ 
    // ... other stuff 
    session, err := mgo.Dial(mongodbURL) 
     if err != nil { 
     panic(err) 
     } 
    defer session.Close() 
    doThinginOtherFile(session) 
} 

することができますように見えますクローンを作成する必要がある場合は、必要に応じてセッションをクローン/コピーします。

関連する問題