我在日志中收到这些错误:
接受错误:接受tcp [::]:80:接受4:打开的文件过多;
对于ubuntu上的mongodb服务器,使用mgo编写在go中。运行约一天后,它们开始出现。
码:
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)
}
那里有需要关闭的东西吗?还是某种程度上的结构错误?
似乎有很多地方可以设置打开文件的限制,所以我不确定如何找出限制。但是增加限制似乎并不是问题所在,肯定是在每个请求上都打开了一些东西而没有关闭它。
这不是您在Go中存储和使用MongoDB连接的方式。
您必须存储一个mgo.Session
,而不是mgo.Database
实例。而且,每当需要与MongoDB进行交互时,您都可以获取会话的副本或副本(例如,使用Session.Copy()
或Session.Clone()
),并在不需要时关闭它(最好使用defer
语句)。这将确保您不会泄漏连接。
您也 虔诚地 忽略检查错误,请不要这样做。不管返回什么error
,都要检查并正确处理(至少可以做的是打印/记录它)。
所以基本上您需要做的是这样的:
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
}
我使用下面的代码上传一个文本文件到服务器,它可以工作。 但当我从服务器下载文本文件时,我无法打开它,并发现文本文件中添加了其他消息(粗体文本)。 --RzBVXI2AHuDiIU5UHz-A1jZrpEg6a0JY内容处理:表单数据;name=“userfile”;filename=“test.txt”内容类型:应用程序/八位字节流内容传输编码:二进制 所容纳之物 --RzBVXI2AHuDiIU
我一直在开发一个基于Java kafka-streams API的应用程序,其目标是处理来自一个kafka主题的数据流,并将其生成到另一个主题中。 看起来,每当我开始使用kafka-streams应用程序生成消息时,我正在使用的kafka代理上的文件句柄就会一直打开,而且从来没有关闭过,这意味着最终kafka服务器会出现太多打开的文件,kafka和zookeeper守护进程崩溃。 我使用API j
问题内容: 创建容器时出现该错误消息。 但是我找不到有关该错误的任何信息。(我看到了https://github.com/docker/libcontainer/issues/211,但是那不是同样的问题。)有人知道吗? 谢谢。 问题答案: 默认的打开文件数限制为1024。可以通过两种方式增加它: 使用参数运行容器: 使用mode 运行容器并执行。 您可以在此处找到更多信息。
问题内容: 我正在开发一个巨大的旧版Java应用程序,其中包含许多手写内容,如今您可以让一个框架来处理。 我现在面临的问题是,我们的Solaris Server上的文件句柄用尽了。我想知道跟踪打开文件句柄的最佳方法是什么?在哪里查看,什么会导致打开的文件句柄用尽? 我不能在Solaris下调试应用程序,只能在Windows开发环境上调试。分析Windows下的打开文件句柄是否甚至合理? 问题答案:
服务器 用于监听服务器中每个客户机的线程在名为OyenteCliente(ClientListener)的类中实现,每个客户机中监听服务器petitios的线程在OyenteServidor(ServerListener)中实现。 客户监听器 非常感谢!
问题内容: 我对编程和python语言非常陌生。 我知道如何在python中打开文件,但问题是如何将文件作为函数的参数打开? 例: 这是我写出代码的方式: 问题答案: 您可以轻松地传递文件对象。 然后在您的函数中,返回行列表 另一个技巧是,python文件对象实际上具有读取文件行的方法。像这样: 第二种方法,就像您的功能一样。您不必再次调用它。 更新 这里是您应该如何编写代码的方法: 第一种方