java - 数据库连接数与 Java 线程数

标签 java database multithreading

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

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

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

通常有 3000 个表需要比较,并且表的列表/架构可以预先获得,并且暂时假设每个表中的记录数为数百条(因此我不需要多次查询表)。

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

这是我的几个问题,说 N 就是不。核心数,M 是最大核心数。数据库可以采用的数据库连接数

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

最佳答案

N is no. of cores and M is max no. of db connections the dbs can take

  1. If I have more threads than N, will that be useful for my use case? if yes, how?
  2. What is the limiting factor here - No. of cores or no. of connections?
  3. Does having more threads than M is of any use?
  1. 是的,生成比核心更多的线程会有所帮助,因为在任何给定时间,一些线程在执行 I/O 时都会被阻塞,此时其他线程可以进行处理。

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

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

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

关于java - 数据库连接数与 Java 线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55062786/

相关文章:

mysql - 当特定列不为空时按优先级获取最大值

database - Docker如何管理数据库?

Android - 在线程之间传递数据

java - 为什么 Char 不会打印,并且计数器超出了我的循环;

c++ - 如何优化同时多线程的代码?

java - Ant 在构建时下载一个 Jar

java - 如何设置JInternalFrame标题?

java - 无效的 HTTP 方法 : PATCH

java - 如何将 lwjgl 应用程序放入 Javafx/swing Canvas 中

php - 如何制作带有下拉框的 Web 表单以将数据插入关系数据库