c++ - 为每个查询初始化到 MYSQL 的连接有多糟糕?

标签 c++ mysql multithreading

我有一个应用程序,是我在过去几年编写和开发的。该应用程序作为策略 mmo 服务器端工作。 该应用程序使用 MySql c++ 连接器。 如您所知,MySql 不能由一个以上的线程用于一个连接。所以,虽然我的应用程序是多线程的,但它被设计为从一个线程与 MySql 一起工作。 现在我决定从主线程中删除一些功能主义者并将它们放在另一个线程中。事实上,我将为某些任务创建新线程。

我知道这可能有点奇怪和错误,而且我也知道我不应该创建大量的数据库连接,但是如果我忘记了连接池并为每个查询创建连接会怎样?

有没有人知道如果我这样做,服务器应用程序会发生什么情况?

最佳答案

当你问“如果我[原文如此]这样做,服务器应用程序会发生什么”时,我不完全明白你的意思,但我是假设您担心性能,那么我会尝试回答这个问题。

“MySQL 性能博客”上有一篇分为两部分的文章,内容涉及 SSL 加密对 MySQL 性能的影响(此处为 part onepart two。)我建议您阅读一下。

作者正在评估使用(内置或其他)SSL 加密对 MySQL 查询吞吐量和延迟的性能开销。这听起来可能无关紧要,但作为他的基准测试的一部分,他还评估了 SSL 对持续尽可能快地与服务器连接和断开连接的程序的影响。

通过比较文章第 1 部分中的第一个图表(即“Sysbench 只读 - 吞吐量”)和第三个图表(即“连接吞吐量”),您将看到在多线程环境中重复连接到服务器将导致每秒执行的查询数量减少大约 10 倍到 20 倍(从 30K-50K 到不到 3K)。

即使是第三张图表也能告诉您很多信息。根据该图表,如果您为每个查询创建一个新连接,您每秒只能执行少于 3000 个查询绝对最大值

这可能会帮助您计算游戏服务器性能的上限。如果每次查询都连接到数据库,即使使用很多线程,也只能建立三千个连接。如果您需要(即使在理论上)每秒超过 3K 次查询,您不能使用此方法。您将需要一个连接池或每个线程一个连接或其他东西。

需要注意两点:

  • 每秒 3K 连接数是在您根本不进行任何查询时得出的。如果你真的在执行查询,你的数字会更糟。
  • 我链接到的网站(我认为)由一些 Percona 开发人员运营(它是 MySQL 的替代品/备选方案。)基准数据对我来说看起来很合理,但您可能想得出自己的结论。<

关于c++ - 为每个查询初始化到 MYSQL 的连接有多糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22144508/

相关文章:

python - 在 Mac OS X 上使用 Swig 将 C++ 包装到 Python

c++ - Unresolved external symbol 错误是什么意思?

MySQL,选择,比较两个表中的值

c++ - std::set比较器

c++ - 在 C++ 中搜索树(非二进制)

mysql - 使用 PDO 的资源链接标识符?

mysql - 无法在 jdbc 中的 select 中设置单引号

c#.net 4.5 异步/多线程?

r - 为什么foreach%dopar%随每个其他节点变慢?

java - 线程安全读/写计数器