问题现象:mongodb用固定连接,如果有多个http请求,在短时间内有大量请求要用mongdb的查询操作,会导致程序assert挂死在findN里,并抛出异常,
MongoDB socket exception
DBClientBase::findN: transport error:
等。
在网上花了很多时间查找解决办法,找后来一个解决办法是改固定连接这连接池。
最开始是
DBClientConnection* conn = new DBClientConnection(true,0,5);
conn->connect( ip + ":" + port , errmsg );
一直保存这个conn
后面改成用连接池:
try
{
scoped_ptr<ScopedDbConnection> conn(//pool连接池中分配一个连接,超时设置为30s
ScopedDbConnection::getInternalScopedDbConnection( m_hostAddr, m_timeout ) );
out = conn->get()->mapreduce(ns, map, reduce, mongo::BSONObj());
conn->done();
//m_pconn->insert(ns, valueInsert,0);
}
catch(...)
{
return ERR_FAIL;
}
需要用的时候创建一个连接,用完后就调用done(),释放连接