2016-05-05 16 views
1

私は今少しだけ行きましたが、私はそれが大好きですが、それは他の言語とは異なることがいくつかあるようです。だから私はmgoパッケージでMongoDbを使用するWebアプリケーションを書いています。私はベストプラクティスが他のパッケージ(私のモデル)で使用するためにデータベースセッションを開いたままにすることが何であるか疑問に思っています。Golangのパッケージ間でデータベースセッションを開いたままにする標準的な方法はありますか?

私は間違った理想で私を修正することは自由に感じます。私はGOを使い始めました。私が考えているHERESに何

package main 

import(
    ds "api-v2/datastore" 
) 

type Log struct { 
    Name string 
} 

func main() { 
    sesh := ds.Sesh 

    err = &sesh.Insert(&Log{"Ale"}) 
} 

そして、私のデータストアのパッケージで:

package datastore 

import(
    "gopkg.in/mgo.v2" 
) 

var Sesh = newSession() 

func newSession() **mgo.Session { 
    session, err := mgo.Dial("localhost") 
    if err != nil { 
     panic(err) 
    } 

    return &session 
} 

ありがとう! mgoのドキュメントによると

+1

この回答が役立つかどうかを確認してください。 [Link](http://stackoverflow.com/a/26576589/2285935) –

+0

セッションをローカル変数として開始するパッケージを作成します。次に、この変数を取得し、完了したら閉じます関数を作成します。私は私のデスクトップに行くときにいくつかのコードを提供します – CESCO

答えて

1

https://godoc.org/gopkg.in/mgo.v2

そのリソースをプールに戻すか、収集することができるので、その寿命の最後に呼び出さそのCloseメソッドを持っている必要があります作成したすべてのセッションを、依存ケースに。

Close()は、ジョブが実行されている限り呼び出す必要があります。メソッドが呼び出されると、セッションはプールに戻されます。

また、そのソースコード(https://github.com/go-mgo/mgo/blob/v2-unstable/session.go#L161)を見て、Dial法上のいくつかのコメントがあります

// This method is generally called just once for a given cluster. Further 
// sessions to the same cluster are then established using the New or Copy 
// methods on the obtained session. This will make them share the underlying 
// cluster, and manage the pool of connections appropriately. 
// 
// Once the session is not useful anymore, Close must be called to release the 
// resources appropriately. 

Dial方法に一度だけ、単一のクラスタの必要性。後のセッションにはNewまたはCopyを使用してください。そうしないと、接続プールの利点が得られません。

---更新---

私は例を作成しようとしていたが、私は@ジョンS Perayilのコメントからのリンクは非常に類似した考えを持っていることがわかりました。私が強調したかった何

Dial方法あなたが起動時に一度だけを呼ぶべきであるということです、initメソッドにそれを置くことをお勧めします。そして、session.Copy()を返すメソッド(例えば、newSession)を作成することができます。

は、これはあなたがメソッドを呼び出す方法です:

func main() { 
    session := ds.NewSession() 
    defer session.Close() 

    err = &session.Insert(&Log{"Ale"}) 
} 

は、どういうわけか私はあなたが、あなたのコードでdefer session.Close()を起動しませんでしたdeferは右、このメソッドの実行の終了前にコードを実行されることに気づきました。

+0

助けてくれてありがとう!コード例を提供できますか? – CloudyHLS

関連する問題