【问题标题】:Is each connection backed by one Thread in Database Connection Pooling?每个连接是否由数据库连接池中的一个线程支持?
【发布时间】:2015-10-29 19:19:39
【问题描述】:

在数据库连接池中,

  • 每个连接是否对应数据库中的 1 个线程?
  • 真的很重要吗?我的意思是,可能有一个线程池 执行器,执行连接对象必须执行的任何操作?

我想知道它是如何工作的,因为这将有助于理解这些东西实际上是如何调整的。

到目前为止,我的理解是“一个连接 - 一个线程”。否则为什么大多数数据库会阻塞?

【问题讨论】:

  • 您使用的是什么数据库管理系统?您使用的是什么 Java 驱动程序/连接器?
  • @kdbanman 我认为有一种方法包括了解您正在做的事情的总体情况,这与您可能实现的特定代码一样重要。稍微抽象一点也不是坏事。
  • 然而,为了回答你的问题,我正在与一个名为 Stardog 的 TripleStore 合作。数据库客户端,建议设置您的池大小。卖家给出了一些建议。但总的来说,我认为理解如何调整这些东西,需要对线程和数据库的功能有更深入的了解。
  • 你说的是“它”,但没有说出野兽的名字。这取决于游泳池。在我的服务器创建的连接中,每个池连接都相当于数据库中的一个线程。这就是我的“它”的特点。这并不能保证所有“它的”都这样工作。

标签: java multithreading database-connection connection-pooling


【解决方案1】:

连接池是您在客户端(即在 Java 中)所拥有的。

连接池就是这样 - 一个与数据库的开放连接池。这些不绑定到线程,任何数量的线程都可以在任何给定时间从池中请求连接 - 如果连接可用,池将授予请求,如果没有,它将创建一个新的,阻止或拒绝连接请求(取决于实现)。这里的主要思想是连接比线程少,另一个目的是保持这些连接打开如果有许多短的数据库操作(创建数据库连接是一项昂贵的操作)。

在服务器端,这取决于数据库实现。我希望大多数数据库服务器每个连接使用一个线程——毕竟有人必须监听打开的套接字。但是对于许多数据库引擎来说,这可能要复杂得多,例如可能有一个模块在侦听套接字,然后将查询发送到另一个可能有不同数量的线程在运行的模块。

【讨论】:

  • 我认为您的回答对我有帮助。很高兴让我想起事情的客户端。但是我认为无论你在客户端做什么都会受到你在服务器端做什么的影响。
  • 我阅读了一篇关于此事的非常好的博文。 github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing,我认为这是有根据的。但是,它们似乎没有区分您的 threadPool 和数据库上发生的情况?或者也许我错了,这个人只考虑客户端的线程数。尽管如此,似乎假设是每个连接一个线程(在客户端)
  • 我认为说“这里的主要思想是连接比线程少”太简单了。我分享的博客对此进行了更多说明。但推理更多的是,照顾你的机器的架构,并有一些与之成比例的连接。在这种情况下,他的意思是,每个连接有多个线程,这反映了您拥有的核心数量,模一些公式要考虑,磁盘访问和网络等等......
  • 这是最后一部分让我感到困惑,因为磁盘访问将与数据库的实际位置有关,它更像是服务器问题而不是客户端问题,因为你似乎要小心区分。
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多