查询后的MongoDB套接字异常不返回任何结果

时间:2013-03-27 16:02:32

标签: c++ mongodb

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

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

  • 在此查询之后,如果我尝试执行另一个查询,则 声明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。

1 个答案:

答案 0 :(得分:0)

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

我认为你会发现在使用ScopedDbConnection时更加接近连接采集并从驱动程序获得新的连接将有助于实现这一目标;司机似乎很好地管理了连接。