if (m_db_cur_conn_cnt >= m_db_max_conn_cnt)
讯享网
讯享网 { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果已经到达了,看看是否需要超时等待</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(timeout_ms <= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 死等,直到有连接可以用 或者 连接池要退出</span> {
log_info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wait ms:%d “, timeout_ms);
讯享网 m_cond_var.wait(</span><span style="color: rgba(0, 0, 255, 1)">lock</span>, [<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">] { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("wait:%d, size:%d ”, wait_cout++, m_free_list.size());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前连接数量小于最大连接数量 或者请求释放连接池时退出</span> <span style="color: rgba(0, 0, 255, 1)">return</span> (!m_free_list.empty()) |<span style="color: rgba(0, 0, 0, 1)"> m_abort_request; }); } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> return如果返回 false,继续wait(或者超时), 如果返回true退出wait </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.m_free_list不为空 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.超时退出 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3. m_abort_request被置为true,要释放整个连接池</span> m_cond_var.wait_for(<span style="color: rgba(0, 0, 255, 1)">lock</span>, std::chrono::milliseconds(timeout_ms), [<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">] { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("wait_for:%d, size:%d ”, wait_cout++, m_free_list.size());

讯享网 <span style="color: rgba(0, 0, 255, 1)">return</span> (!m_free_list.empty()) |<span style="color: rgba(0, 0, 0, 1)"> m_abort_request; }); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 带超时功能时还要判断是否为空</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(m_free_list.empty()) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果连接池还是没有空闲则退出</span> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } } </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(m_abort_request) { log_warn(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">have aboort “);
讯享网 </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 还没有到最大连接则创建连接</span> {
CDBConn </span>*pDBConn = <span style="color: rgba(0, 0, 255, 1)">new</span> CDBConn(<span style="color: rgba(0, 0, 255, 1)">this</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新建连接</span> <span style="color: rgba(0, 0, 255, 1)">int</span> ret = pDBConn-><span style="color: rgba(0, 0, 0, 1)">Init(); </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (ret) { log_error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Init DBConnecton failed ”);
讯享网 </span><span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> pDBConn; </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { m_free_list.push_back(pDBConn); m_db_cur_conn_cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("new db connection: %s, conn_cnt: %d ”, m_pool_name.c_str(), m_db_cur_conn_cnt); }
}</span></pre>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/187505.html