【问题标题】:Number of DB Connections vs Java Threads数据库连接数与 Java 线程数
【发布时间】:2019-03-08 11:57:56
【问题描述】:

我目前正在开发一个 java 应用程序,用于比较 2 个不同数据库中的表数据。

我正在使用连接池和线程池执行器服务。我使连接数和线程数可配置,因此试图找到所需的最佳连接数和最佳线程数。

我知道获得最佳数量的最佳方法是尝试不同的数字,但我的问题是我应该考虑哪些因素或如何计算所需的连接/线程数。

通常有 3000 个表要比较,表的列表/模式可预先提供,暂时假设每个表中的记录数为数百(因此我不需要多次查询表)。

目前,我的应用程序为每个表生成一个线程(来自线程池),并与 2 个不同的数据库建立 2 个不同的 db 连接(现在按顺序),一旦检索到数据,同一个线程就会调用一个方法来比较数据。

我有几个问题,说 N 是否。核心数,M 是最大数量。 dbs 可以使用的 db 连接数

  1. 如果我的线程数超过 N,这对我的用例有用吗?如果是,怎么做?
  2. 这里的限制因素是什么 - 核心数或没有。连接数?
  3. 线程数多于 M 有什么用?

【问题讨论】:

    标签: java database multithreading


    【解决方案1】:

    N 不是。核心数,M 是最大数量。 dbs 可以使用的 db 连接数

    1. 如果我的线程数多于 N,这对我的用例有用吗?如果是,怎么做?
    2. 这里的限制因素是什么 - 核心数或没有。连接数?
    3. 线程数多于 M 有什么用?
    1. 是的,产生比内核更多的线程会有所帮助,因为在任何给定时间,一些线程将被阻止执行 I/O,此时其他线程可以进行处理。

    2. 从上面可以看出,限制因素当然不是核心数量。然而,连接的数量也可能不是限制因素。当然,您不能超过连接数,但您可能会发现您甚至无法达到该限制,因为磁盘吞吐量(在数据库服务器端)或网络拥塞可能会在您达到该限制之前成为问题。

    3. 如果您确保 a) 从连接池中获取连接,b) 读取所有数据,c) 将连接释放回池中,则拥有比最大连接数更多的线程可能会产生一些小的好处,然后 d) 比较数据。这是因为当一个线程比较数据时,另一个线程可以使用该连接来读取数据。但是,比较数据听起来是一项相当简单和快速的工作,因此好处不会那么大:您的线程将相当快地完成数据比较,之后它将希望从池中获取另一个连接,此时指出如果所有连接都在使用中,它将被阻止。

    话虽如此,但我希望您知道存在可以为您进行此类比较的工具,甚至是免费工具。搜索“SQL 比较”。 (我知道,这是用词不当,这些工具不比较 SQL,他们比较数据库,并且他们碰巧使用 SQL 来查询他们比较的数据库;我没有想出名字,这些工具的创建者。 )

    【讨论】:

    • 感谢您的回答 Mike,非常感谢您让我更好地理解他们。我同意有许多可用的开源/免费比较工具,但不幸的是,除了模式和数据比较之外,我们不能将它们用作我们提出的框架也可以处理其他任务
    【解决方案2】:

    您的问题的简单答案是“视情况而定”;即没有简单的答案或神奇的公式。

    您执行的每个数据库查询都有涉及客户端计算的步骤、需要服务器上的计算和磁盘 I/O 的步骤,以及涉及通过网络传输查询和结果的步骤。对于任何给定的查询,这些步骤以特定的顺序发生。而执行查询的经过时间是执行每个步骤所花费的时间,一个接一个。

    让我们假设(为了论证)查询是独立的;即一个查询不会锁定另一个查询所依赖的资源。

    现在,如果您的工作负载足够轻(取决于查询本身和客户端线程的数量),那么每个查询的各个步骤将消耗越来越多的(相关)可用资源(CPU、I/O带宽)。您可以继续增加客户端线程的数量,但在某些时候,其中一个资源可能会以 100% 的速度使用……您将遇到瓶颈。一旦达到这一点,增加客户端线程的数量不会使查询变得更快。走得太远,由于各种资源争用效应,吞吐量将开始下降。

    问:我们能否预测吞吐量限制是多少?

    答:如果没有对整个系统和工作负载进行深入分析,那是……不切实际的。

    问:我们能否预测瓶颈会是什么?

    答:如果没有对整个系统和工作负载进行深入分析,那是……不切实际的。

    问:对于给定数量的客户端内核,我们能否推断出最佳客户端线程数。

    A:不知道前两个问题的答案。


    问:那么解决线程池大小这个难题的实际方法是什么?

    答:基准测试和调整!

    找出您的实际工作负载,创建一个指示性基准(或将您的工作负载视为基准),并在向上或向下调整客户端线程数的同时反复运行它。同时,测量客户端和数据库上的实际 CPU 和 I/O 负载,试图找出实际的资源瓶颈在哪里。这些措施可能对其他类型的调优(例如数据库和查询优化、网络调优)以及决定您是否需要更多硬件、更快的网络接口等很有用。

    如果采用“benchmark and tune”,则不需要准确预测线程数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2014-12-10
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多