mysql场景:
当我在mysql中使用多个线程执行“select”查询时,我得到以下消息:“commands-out-of-sync;您现在不能运行这个命令”,我发现这是由于必须等待“消费”结果以进行另一个查询的限制。c++示例:
void DataProcAsyncWorker :: Execute ()
{
std :: thread (& DataProcAsyncWorker :: Run, this) .join ();
}
void DataProcAsyncWorker :: Run () {
sql :: PreparedStatement * prep_stmt = c-> con-> prepareStatement (query);
...
}
重要提示:
我忍不住对每个查询使用多个线程(select、insert等),因为我正在构建的与nodejs集成的模块“锁定”线程,直到已经获得结果,因此我需要在后台运行(新线程),并解析包含从mysql获得的结果的“promise”
重要提示:
我保存了几个“连接”[示例:10],每次sql调用函数都会选择一个连接。这是:1。包含10个已建立连接的连接池,例如:
for (int i = 0; i <10; i ++) {
Com * c = new Com;
c-> id = i;
c-> con = openConnection ();
c-> con-> setSchema ("gateway");
conns.push_back (c);
}
2.问题发生在每秒执行>=100个select查询时,我认为即使连接平衡,每秒100个连接也是一个很高的数字,并且连接“ex:conns.at(50)”正在处理中并且没有被消耗
我的问题是:
答。postgresql也有这个限制吗?或者在postgresql中也有这样的限制?
b。对于每秒的大型sql查询,建议使用哪个使用sql命令的服务器,而不需要“打开新连接”,即:在conns.at(0)连接中,我可以执行(通过两个同时执行的线程)select命令。
附加:
1.我甚至可以在池中创建更多的连接,但是当我模拟每秒的查询数大于预设连接数时,我会得到错误:“命令不同步”,我找到的唯一解决方案是mutex,这对性能不利
1条答案
按热度按时间zaqlnxep1#
我发现postgresql用这个(queue/queue)看起来很棒,非常有效,不像mysql需要调用“\u free\u result”,在postgresql中,我可以在同一个连接上运行多个查询,而不会收到错误:“commands out of sync”。
注意:我使用libpqxx(用于连接/查询到c中的postgresql服务器的库)进行了测试,它真的像一个奇迹一样工作而不让我头痛。
注意:我不知道它是否允许多线程执行,或者每个连接的执行都是在服务器端同步完成的,我只知道postgresql中没有这样的错误。