복붙노트

[MONGODB] 산화 마그네슘 (MgO) 세션을 유지하는 모범 사례

MONGODB

산화 마그네슘 (MgO) 세션을 유지하는 모범 사례

저는 현재 웹 응용 프로그램의 MgO lib 디렉토리와 MongoDB를 사용하고,하지만 난 그것을 사용하고 방법이 좋은 하나입니다 있는지 확실하지 않습니다 ..

package db

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

const (
    MongoServerAddr = "192.168.0.104"
    RedisServerAddr = "192.168.0.104"
)

var (
    MongoSession, err = mgo.Dial(MongoServerAddr)

    MDB  = MongoSession.DB("message")
    MCol = MDB.C("new")
    MSav = MDB.C("save")

    UDB  = MongoSession.DB("account")
    UCol = UDB.C("user")
)

나는 DB 세션을 초기화하기 및 수집 및 문서 값을 취 변수를 만들 내가 컬렉션을 조회 할 때, 나는 그것을 만들기 위해 변수를 사용합니다.

그와 마찬가지로 :

func UserExist(username string) bool {
    user := Users{}
    err := db.UCol.Find(bson.M{"username": username}).One(&user)
    if err != nil {
        return false
    } else {
        return true
    }
}

그래서 가장 좋은 방법은이 경우, 또는이 사람은 괜찮 ..? 감사

해결법

  1. ==============================

    1.그와 같은 글로벌 세션을 사용하지 않는 것이 좋습니다. 대신 모든 데이터베이스의 상호 작용을 담당하는 유형을 만들 수 있습니다. 예를 들면 :

    그와 같은 글로벌 세션을 사용하지 않는 것이 좋습니다. 대신 모든 데이터베이스의 상호 작용을 담당하는 유형을 만들 수 있습니다. 예를 들면 :

    type DataStore struct {
        session *mgo.Session
    }
    
    func (ds *DataStore) ucol() *mgo.Collection { ... }
    
    func (ds *DataStore) UserExist(user string) bool { ... }
    

    그 디자인에 많은 혜택이 있습니다. 중요한 하나는, 당신은 같은 시간에 비행에서 여러 세션을 가질 수 있다는 것입니다 그래서 당신은이 HTTP 처리기, 예를 들어, 당신은 단지 하나의 요청에 대한 독립적 인 세션의 지원되는 로컬 세션을 생성 할 수있는 경우 :

    func (s *WebSite) dataStore() *DataStore {
        return &DataStore{s.session.Copy()}
    }    
    
    func (s *WebSite) HandleRequest(...) {
        ds := s.dataStore()
        defer ds.Close()
        ...
    }
    

    세션이 내부적으로 캐시 및 유지 / 재사용으로 산화 마그네슘 드라이버는,이 경우에 잘 동작합니다. 각 세션은 사용하면서 독립적 인 소켓에 의해 뒷받침되고, 독립적 인 설정을 구성 할 수 있습니다, 또한 독립적 인 오류 처리를해야합니다. 이들은 당신이 결국은 하나의 글로벌 세션을 사용하는 경우 처리해야 문제입니다.

  2. ==============================

    2.직접 귀하의 질문에 대답 당신은 / 연기 사용 (심지어 mgo.session.Ping) 산화 마그네슘 호출 공황 이후 복구해야합니다 확인 산화 마그네슘 세션에 대한하지 않지만. 지금까지 내가 말할 수있는 산화 마그네슘 세션 상태를 확인하는 다른 방법은 (산화 마그네슘 godocs)이 없습니다. 당신은 구스타보 메이어의 제안을 사용하고 데이터 저장소 유형의 메소드를 추가 할 수 있습니다.

    직접 귀하의 질문에 대답 당신은 / 연기 사용 (심지어 mgo.session.Ping) 산화 마그네슘 호출 공황 이후 복구해야합니다 확인 산화 마그네슘 세션에 대한하지 않지만. 지금까지 내가 말할 수있는 산화 마그네슘 세션 상태를 확인하는 다른 방법은 (산화 마그네슘 godocs)이 없습니다. 당신은 구스타보 메이어의 제안을 사용하고 데이터 저장소 유형의 메소드를 추가 할 수 있습니다.

    func (d *DataStore) EnsureConnected() {
        defer func() {
            if r := recover(); r != nil {
                //Your reconnect logic here.
            }
        }()
    
        //Ping panics if session is closed. (see mgo.Session.Panic())  
        d.Ping()
    }
    
  3. ==============================

    3.이동 1.7으로 웹 서버에 몽고 세션을 처리하는 가장 관용적 방법은 요청 컨텍스트 (이)라고 완료 할 때마다에 ()를 연기 session.Close을 첨부 할 수 있습니다 미들웨어를 작성하는 새로운 표준 라이브러리 패키지 컨텍스트를 사용하는 것입니다. 당신은 가까이 remeber 필요가 없습니다

    이동 1.7으로 웹 서버에 몽고 세션을 처리하는 가장 관용적 방법은 요청 컨텍스트 (이)라고 완료 할 때마다에 ()를 연기 session.Close을 첨부 할 수 있습니다 미들웨어를 작성하는 새로운 표준 라이브러리 패키지 컨텍스트를 사용하는 것입니다. 당신은 가까이 remeber 필요가 없습니다

    AttachDeviceCollection = func(next http.Handler) http.Handler {
            return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                db, err := infra.Cloner()
                if err != nil {
                    http.Error(w, err.Error(), http.StatusInternalServerError)
                    return
                }
                collection, err := NewDeviceCollection(db)
    
                if err != nil {
                    db.Session.Close()
                    http.Error(w, err.Error(), http.StatusInternalServerError)
                    return
                }
                ctx := context.WithValue(r.Context(), DeviceRepoKey, collection)
                go func() {
                    select {
                    case <-ctx.Done():
                        collection.Session.Close()
                    }
                }()
    
                next.ServeHTTP(w, r.WithContext(ctx))
            })
        }
    
  4. from https://stackoverflow.com/questions/26574594/best-practice-to-maintain-a-mgo-session by cc-by-sa and MIT license