1
  • 现在,在下面的简化代码段中,如果我的查询返回结果,则一切正常。

  • 如果查询没有返回结果,那么一切仍然按预期进行,抛出并捕获异常。

  • 在此查询之后,如果我尝试执行另一个查询,则该语句dbConn->query(collection, queryObj)会抛出一个mongo::SocketException. 打印的消息是:

    socket exception [SEND_ERROR] for 127.0.0.1:27017 // 9001 socket exception [2] server [127.0.0.1:27017]

  • 从这个开始,以下查询都抛出相同的异常,并带有不同的消息: socket exception [FAILED_STATE] for localhost:27017 // 9001 socket exception [5] server [localhost:27017]

  • 我还打印了错误代码字符串,它们都是“未知错误”。

  • 如果我重新启动该过程,它会重置,因此我假设连接以某种方式损坏。目前没有其他人正在访问共享 ptr。mongo 守护进程运行良好,mongodb 日志中没有任何异常。

  • 我的大问题是:为什么会发生?

片段:

try
{
    // Some initialzation here..
    // dbConn is a boost::shared_ptr<mongo::DBClientConnection>

    std::auto_ptr<mongo::DBClientCursor> cursor = dbConn->query(collection, queryObj);
    if (!cursor->more())
    {
        throw Exception();
    }
}
catch(const Exception&)
{

}
catch(const mongo::SocketException& e)
{
    std::cout << ex.what() << "//" << ex.toString() << std::endl;
}

MongoDB C++ 驱动程序版本为 2.3.2。

4

1 回答 1

0

我假设您在代码中的其他位置获取并初始化连接,期望避免每次需要时获取该连接的开销。(我最初也是在我的代码中这样做的)。

我想您会发现,在使用过程中更靠近ScopedDbConnection获取连接并从驱动程序获得新连接会有所帮助;驱动程序似乎可以很好地管理连接。

于 2013-07-19T22:15:43.337 回答