当前位置: 首页 > 知识库问答 >
问题:

Go MongoDB(mgo)-不释放关闭的连接

许出野
2023-03-14

我的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在调用后立即关闭这个新连接。关闭()方法。

如果我们异步创建连接,mongo即使在调用后也会保持这个新连接的活动状态。Close()方法。

>

是否有其他方法强制关闭连接插座?

它会在一段时间后自动关闭这些打开的连接吗?

共有1个答案

卫弘图
2023-03-14

它是连池。当你“关闭”一个会话时,它不一定是关闭的;它可能只是被返回到池中重复使用。在同步示例中,它不需要扩展池;你一次只使用一个连接。在并发示例中,你一次使用多个连接,所以它可能会决定它确实需要扩展池。我认为10个打开的连接不值得担心。

用一个更大的测试来尝试它——比如说,10批10个goroutines——看看之后打开了多少个连接。如果你有100个连接打开,说明出了问题;如果你有10~20个,那么池工作正常。

 类似资料:
  • 我将EclipseLink与JTA一起使用。当我使用WebLogic server版本(12.2.1.3.0)运行应用程序时,遇到了以下问题 PS-WebLogic版本(12.2.1.2.0)不面临此问题

  • 我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前

  • 问题内容: 我在Redis中存储json数据列表,并使用ServiceStack c#客户端访问它。我本质上是在管理自己的外键,在其中存储id,然后使用应用程序内部的接口从中提取ID ,然后从Redis获取基础json对象并将其打包为列表以返回其他部分我的申请。 我正在使用,因为我希望Redis可以托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Wind

  • 我使用Java应用程序前端与MySQL 5.6服务器上的数据库进行连接和交互。使用MySQL的JDBC连接器时,我遇到了连接到服务器的问题,当连接失败时,服务器没有关闭。调用close()。但当应用程序关闭时,所有连接都会断开。下面是用于进行查询的dao类。 接下来的代码是使用数据库验证应用程序用户的方法。有一些System.out.println()语句在整个过程中跟踪con变量。 运行该方法的

  • 我有这样的代码: Veracode在这一行上检测到一个缺陷(不正确的资源关闭或释放)bw.write(s);怎么解决这个?提前致谢

  • 我已经发出了一个类似于上面的http请求。 为了释放基础连接,调用(1)和(2)是否正确?这两种调用之间有什么区别?