[MONGODB] 산화 마그네슘 이동 서버에 너무 많은 열려있는 파일
MONGODB산화 마그네슘 이동 서버에 너무 많은 열려있는 파일
나는 로그에 이러한 오류를 받고 있어요 :
우분투에 MongoDB를 서버, 산화 마그네슘을 사용하여 이동에 작성합니다. 그들은 약 하루 동안 실행 됐어요 후 나타나는 시작합니다.
암호:
package main
import (
"encoding/json"
"io"
"net/http"
"gopkg.in/mgo.v2/bson"
)
var (
Database *mgo.Database
)
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello")
}
func setTile(w http.ResponseWriter, r *http.Request) {
var requestJSON map[string]interface{}
err := json.NewDecoder(r.Body).Decode(&requestJSON)
if err != nil {
http.Error(w, err.Error(), 400)
return
}
collection := Database.C("tiles")
if requestJSON["tileId"] != nil {
query := bson.M{"tileId": requestJSON["tileId"]}
collection.RemoveAll(query)
collection.Insert(requestJSON)
w.WriteHeader(200)
w.Header().Set("Content-Type", "application/json")
js, _ := json.Marshal(map[string]string{"result": "ok"})
w.Write(js)
} else {
w.WriteHeader(200)
w.Header().Set("Content-Type", "application/json")
w.Write(js)
}
}
func getTile(w http.ResponseWriter, r *http.Request) {
var requestJSON map[string]interface{}
err := json.NewDecoder(r.Body).Decode(&requestJSON)
if err != nil {
http.Error(w, err.Error(), 400)
return
}
collection := Database.C("tiles")
var result []map[string]interface{}
if requestJSON["tileId"] != nil {
query := bson.M{"tileId": requestJSON["tileId"]}
collection.Find(query).All(&result)
}
if len(result) > 0 {
w.WriteHeader(200)
w.Header().Set("Content-Type", "application/json")
js, _ := json.Marshal(result[0])
w.Write(js)
} else {
w.WriteHeader(200)
w.Header().Set("Content-Type", "application/json")
js, _ := json.Marshal(map[string]string{"result": "tile id not found"})
w.Write(js)
}
}
func main() {
session, _ := mgo.Dial("localhost")
Database = session.DB("mapdb")
mux := http.NewServeMux()
mux.HandleFunc("/", hello)
mux.HandleFunc("/setTile", setTile)
mux.HandleFunc("/getTile", getTile)
http.ListenAndServe(":80", mux)
}
필요 닫는 것을 거기에 뭔가 있나요? 아니면 어떤 식 으로든 잘못 구성되어?
이 파일 열기 제한을 설정하는 곳이 많은 것 같다, 그래서 내가 한계가 실제로 무엇인지 찾는 방법을 모르겠어요. 그러나 한계를 증가하는 것은 확실히 뭔가 모든 요청에 개폐되지되고, 어쨌든 문제가되지 않습니다처럼 보인다.
해결법
-
==============================
1.이것은 당신이 저장하고 이동에 MongoDB의 연결을 사용하는 방법이 아니다.
이것은 당신이 저장하고 이동에 MongoDB의 연결을 사용하는 방법이 아니다.
당신은 mgo.Session 아닌 mgo.Database 인스턴스를 저장해야합니다. 그리고 당신은 MongoDB의 상호 작용해야 할 때마다, 당신은 복사 또는 (Session.Copy () 또는 Session.Clone ()와 예) 세션의 복제를 취득하고, 당신이 그것을 필요로하지 않을 때 당신은 사용 (바람직 닫습니다 연기 문). 이것은 당신이 연결을 누설하지 않도록합니다.
당신은 오류 또한 종교적으로 생략 검사, 그렇게하지 마십시오. 오류를 반환 무엇이든간에, (그것을 로그 / 당신이 할 수있는 최소한의 인쇄입니다) 그것을 확인하고 올바르게 행동 않습니다.
그래서 기본적으로 당신이해야 할 일이 같은입니다 :
var session *mgo.Session func init() { var err error if session, err = mgo.Dial("localhost"); err != nil { log.Fatal(err) } } func someHandler(w http.ResponseWriter, r *http.Request) { sess := session.Copy() defer sess.Close() // Must close! c := sess.DB("mapdb").C("tiles") // Do something with the collection, e.g. var tile bson.M if err := c.FindId("someTileID").One(&result); err != nil { // Tile does not exist, send back error, e.g.: log.Printf("Tile with ID not found: %v, err: %v", "someTileID", err) http.NotFound(w, r) return } // Do something with tile }
관련 질문을 참조하십시오 :
MGO - 쿼리 성능이 느린 지속적으로 보인다 (500-650ms)
gopkg.in/mgo.v2의 동시성 (몽고, 이동)
from https://stackoverflow.com/questions/47179890/too-many-open-files-in-mgo-go-server by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 연결 문자열에서 핸들 @ (0) | 2019.12.26 |
---|---|
[MONGODB] MongoDB를가 localhost로 연결할 수 있지만 로컬 호스트의 IP 주소에 연결할 수 있습니다 (0) | 2019.12.26 |
[MONGODB] 어떻게 몽구스 문서 내에서 자유로운 형태의 JSON 데이터를 수 있도록? (0) | 2019.12.26 |
[MONGODB] 내가 어떻게하여 MongoDB에서 배열의 상단에 값을 추가하는 방법은 무엇입니까? (0) | 2019.12.26 |
[MONGODB] MongoDB를 - 월별로 그룹 (0) | 2019.12.26 |