Есть ли стандартный способ сохранить сеанс базы данных открытым для пакетов в Golang?

Я немного поиграл с go, и он мне нравится, но, похоже, у него есть несколько вещей, которые он делает не так, как другие языки. Поэтому я пишу веб-приложение, которое использует 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
}

Спасибо!


person CloudyHLS    schedule 05.05.2016    source источник
comment
Посмотрите, полезен ли этот ответ. Ссылка   -  person John S Perayil    schedule 05.05.2016
comment
Вы создаете пакет, который запускает сеанс как локальную переменную. Затем создайте функцию, которая получает эту переменную, а затем закрывает ее, когда вы закончите. Я предоставлю код, когда доберусь до своего рабочего стола.   -  person CESCO    schedule 11.05.2016


Ответы (1)


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

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

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

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

Итак, вот как вы бы назвали метод:

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

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

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

person ch33hau    schedule 05.05.2016
comment
Спасибо за помощь! Не могли бы вы привести пример кода? - person CloudyHLS; 07.05.2016