我的 MongoDB 数据库的事件连接数量快速增长。
我编写了一段代码来测试连接创建/关闭流程的工作原理。这段代码总结了我如何使用 mgo
我项目中的库。
package main
import (
"time"
"fmt"
"gopkg.in/mgo.v2"
)
func main() {
// No connections
// db.serverStatus().connections.current = 6
mongoSession := connectMGO("localhost", "27017", "admin")
// 1 new connection created
//db.serverStatus().connections.current = 7
produceDataMGO(mongoSession)
produceDataMGO(mongoSession)
produceDataMGO(mongoSession)
produceDataMGO(mongoSession)
// 4 new connections created and closed
// db.serverStatus().connections.current = 7
go produceDataMGO(mongoSession)
go produceDataMGO(mongoSession)
go produceDataMGO(mongoSession)
go produceDataMGO(mongoSession)
// 4 new connections created and closed concurrently
// db.serverStatus().connections.current = 10
time.Sleep(time.Hour * 24) // wait any amount of time
// db.serverStatus().connections.current = 10
}
func connectMGO(host, port, dbName string) *mgo.Session {
session, _ := mgo.DialWithInfo(&mgo.DialInfo{
Addrs: []string{fmt.Sprintf("%s:%s", host, port)},
Timeout: 10 * time.Second,
Database: dbName,
Username: "",
Password: "",
})
return session
}
func produceDataMGO(conn *mgo.Session) {
dbConn := conn.Copy()
dbConn.DB("").C("test").Insert("")
dbConn.Close()
}
我发现了一个我不明白的非常奇怪的事情。根据我们创建新连接的方式(同步/异步),行为会有所不同。
如果我们同步创建连接 - mongo 在调用 .Close()
后立即关闭这个新连接方法。
如果我们异步创建连接 - 即使在调用 .Close()
之后,mongo 仍会保持此新连接处于事件状态方法。
<罢工>罢工>
<罢工> 罢工>- <罢工>
为什么会这样?
有没有其他方法强制关闭连接套接字?它会在一定时间后自动关闭这些打开的连接吗?
- 有什么方法可以限制 MongoDB 可以将其池扩展到的连接数?
- 有没有什么方法可以在没有高负载的情况下设置一定时间后自动截断?
最佳答案
这是连接池。当您“关闭”一个 session 时,它不一定关闭;它可能只是返回到池中重新使用。同步例子中不需要扩池;您一次只使用一个连接。在并发示例中,您一次使用多个连接,因此它可能会决定它确实需要扩展池。我认为 10 个打开的连接不会引起关注。
尝试进行更大的测试 - 例如,10 个批处理,每批 10 个 goroutines - 看看之后有多少连接打开。如果打开了 100 个连接,则说明出现了问题;如果您有 10~20 个,则池化工作正常。
关于database - Go MongoDB (mgo) - 不释放关闭的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47403785/