2016-05-05 6 views
1

Я уже много раз играю, и мне это нравится, но, похоже, он несколько отличается от других языков. Поэтому я пишу веб-приложение, которое использует MongoDb с пакетом mgo. Мне интересно, что лучше всего подходит для открытия сеанса базы данных для использования в других пакетах (мои модели).Есть ли стандартный способ держать сеанс базы данных открытым через пакеты в Голанге?

Не стесняйтесь исправлять меня по любым неправильным идеалам, которые у меня могут быть, я только начал использовать GO.

Вот что я имею в виду:

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 
} 

Спасибо!

+1

Посмотрите, полезен ли этот ответ. [Ссылка] (http://stackoverflow.com/a/26576589/2285935) –

+0

Вы создаете пакет, который запускает сеанс как локальную переменную. Затем создайте функцию, которая получит эту переменную, а затем закроет ее, когда вы закончите. Я предоставлю некоторый код, когда попаду на рабочий стол – CESCO

ответ

1

Согласно документации mgo «s, https://godoc.org/gopkg.in/mgo.v2:

Каждый сеанс созданный должен иметь свой Закрыть метод, называемый в конце его срока службы, поэтому его ресурсы могут быть возвращены в бассейне или собраны, в зависимости по делу.

Необходимо называть 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 для последующих сеансов, иначе вы не сможете воспользоваться преимуществами пула соединений.

--- Обновлено ---

Я пытался создать пример, но я обнаружил, что связь от комментариев @John S Perayil «s имеет довольно подобную идею.

То, что я хотел бы подчеркнуть, из, что Dial метод вы должны вызывать только один раз во время запуска, это хорошая идея, чтобы положить его в init метод. А затем вы можете создать метод (например, newSession), который возвращает session.Copy().

Так что это, как вы могли бы назвать метод:

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

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

Как-то я заметил, что вы не вызвать defer session.Close() в коде, defer будет выполнять код непосредственно перед окончанием выполнения для этого метода ,

+0

Спасибо за помощь! Не могли бы вы привести пример кода? – CloudyHLS