【问题标题】:MariaDB. connection re-use玛丽亚数据库。连接重用
【发布时间】:2021-07-15 20:20:15
【问题描述】:

我有一个数据库,成千上万的用户需要在很短的时间内(通过 ODBC)连接到该数据库(它是一个用于 win32 桌面应用程序的订阅许可数据库)。他们连接,获得他们的批准运行和断开连接)。 max_connections 设置为 1000 但我没有看到我期望服务器端的重用。即服务器当前有大约 800 个进程/连接处于休眠状态(另外 200 个连接到同一服务器上其他数据库中的真实数据)....但是客户端应用程序的新尝试被拒绝“连接太多”。

我错过了什么?

目前已将 max_connections 增加到 1500,但如果这仅意味着另外 500 个休眠连接,则不是长期解决方案。很确定客户端已正确断开连接,但我正在向 win32 应用程序添加一些诊断程序以防万一。

MariaDB 10.3.11

使用 MySQL ODBC 5.3 ANSI 驱动程序

【问题讨论】:

    标签: mysql mariadb connection connection-pooling


    【解决方案1】:

    看到很多会话“正在睡觉”是正常的。这意味着客户端已连接,但此时未执行查询。在运行 SQL 查询之前或之后,客户端可能正在执行其他任务。就像您使用 ssh 登录服务器一样,大多数时候您只是坐在 shell 提示符下,没有运行任何程序。

    您可以自行决定将客户端设计为等待连接,直到他们需要数据,然后在获取数据后立即断开连接。在应用程序中,它们在启动时连接到数据库并保持连接是很常见的。在某些框架中,在启动时建立多个连接,并将它们视为可由客户端应用程序的多个线程使用的池也是很常见的。这是您的应用程序,因此您应该根据需要进行配置。

    要尝试的另一件事是在 MariaDB 服务器中启用线程池。见https://mariadb.com/kb/en/thread-pool-in-mariadb/

    这与客户端连接池不同。线程池允许成千上万的客户端认为他们已连接,而无需在 MariaDB 服务器中为每个连接分配一个成熟的线程。当客户端有东西要查询时,它会被赋予其中一个线程。当该客户端完成后,它可能会继续保持连接,但 MariaDB 服务器中的线程会重新分配给不同客户端的请求。

    这对于许多客户的“突发”工作负载很有用,听起来您的案例可能是一个不错的候选者。

    【讨论】:

    • 比尔,关键是客户端已经断开连接......如果服务器保持睡眠进程准备好被下一个客户端重新使用,那没关系;但是下一个客户得到了“太多的连接”。我的线程池问题是服务器在此许可数据库和其他具有真实数据和“永久”连接的数据库之间共享 - 不想因为必须为每个查询重新建立连接而影响它们的性能。
    • 显然,客户端没有断开连接。否则他们已经提前连接,并且在他们运行查询然后断开连接之前一直处于睡眠状态。但是 MariaDB 服务器(以及 MySQL 也是如此)不会保持连接处于活动状态,除非客户端已连接。
    • 嗯...客户认为他们已断开连接。连接不是池化或共享客户端。我会看看那个 mysql odbc 连接器和 mariadb 是否存在已知问题。
    • 答案具有误导性。 MySQL 有一个线程缓存,它会在客户端连接时重用线程而不是创建新线程。但是断开的线程不会出现在 SHOW PROCESSLIST 中。此处仅显示客户端连接正在使用的线程。
    • 顺便说一句,MySQL 线程缓存是多年前的遗留物,当时创建新线程既昂贵又缓慢。过去,调整线程缓存大小以支持新客户端连接的速率很重要。但是 Linux 内核的进步使得只在需要时创建线程变得更快且影响更小,因此几乎没有人再调整 MySQL/MariaDB 中的线程缓存大小了。
    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 2022-06-15
    • 2021-03-13
    • 2019-10-17
    • 2019-02-24
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多